跳到主要内容
Web3 前端面试题库
返回题库
初级钱包与连接概念题

Provider 对象的能力边界与不可信假设

从 EIP-1193 的职责划分说明 Provider 能做什么、不做什么,以及为什么页面环境中的 Provider 不构成安全边界。

题目

安全评审会上有人提了两个问题:第一,页面被 XSS 之后,攻击者能否通过 Provider 把用户钱包里的资产转走;第二,既然 DApp 能通过 Provider 调用钱包,为什么不把权限判断尽量放到前端,减少钱包确认弹窗。

请说明 Provider 在整体架构中的位置、职责边界,以及上面两个问题在工程上应该怎么回答。

考察目标

  • 说清 Provider 的职责范围:转发 RPC 请求,并在链与账户发生变化时发出事件。
  • 说清密钥与签名发生在哪一侧,DApp 能拿到什么。
  • 给出「不把 Provider 当作可信来源」的具体工程做法。
查看参考答案包含简要回答、深入分析、常见错误与评分标准

30 秒回答

Provider 是钱包暴露给页面的对象,DApp 通过它把请求转发给钱包,并在链或账户变化时收到通知;EIP-1193 规定了一个 request 方法与 connect、disconnect、chainChanged、accountsChanged、message 五个事件。密钥保管与签名在钱包侧完成,页面侧拿到的是地址与签名结果。页面脚本可以改写 Provider,也能在 XSS 后发起钱包请求;是否逐次确认由钱包和具体方法决定,不能把弹窗当成协议保证。实现差异与工程取舍见深入回答。

深入回答

【协议保证】Provider 是钱包在页面中暴露的对象,承担两件事:把 DApp 发起的请求转发给钱包,并在链或账户发生变化时发出事件;EIP-1193 把这一面收在一个 request 方法与五个事件上(依据:EIP-1193 §request、§Events)。

【协议保证】规范要求把 Provider 视为运行在不受信任页面环境中的对象:页面脚本可以读取它、改写它的字段,也可以把它替换成另一个对象(依据:EIP-1193 §Security Considerations)。

【协议保证】Provider 的接口面不包含私钥与助记词;密钥保管与签名动作在钱包进程内完成,页面侧可以拿到账户地址与签名结果(依据:EIP-1193 §Security Considerations 对密钥隔离的说明)。

【协议保证】方法是否被支持由钱包实现决定;对不支持的已最终确定 EIP 方法,规范建议以 4200 拒绝,也允许按该方法的规范返回其他适当错误(依据:EIP-1193 §Supported RPC Methods)。

【实现行为】MetaMask 提供 MetaMask Connect SDK 供 DApp 连接钱包,页面侧与之交互的是 provider 接口而不是密钥材料(依据:MetaMask Connect 文档,页面级)。

【工程经验】钱包侧对来自页面的请求做校验与限流,是规范安全模型下的推荐做法(依据:EIP-1193 §Security Considerations 的建议)。

【工程经验】DApp 侧的可行做法是:按能力探测选择调用路径、对不支持的方法降级、在失败时给出可操作提示,同时把前端校验定位为体验优化而不是安全防线(依据:工程经验,无规范依据)。

【工程经验】页面被注入脚本后,攻击者可以借 Provider 发起请求。钱包的授权策略、已有会话权限与具体方法决定是否弹出确认;EIP-1193 不保证每个资产或权限请求都逐次确认。DApp 应防范 XSS、限制可授予的权限,并在正常流程中如实展示操作内容(依据:EIP-1193 §Security Considerations;工程经验)。

【工程经验】把能力探测与安全判断分开:探测结果只用于选择路径与降级,授权与资产动作交给钱包侧流程(依据:工程经验,无规范依据)。

常见错误

  • 认为 Provider 保存私钥,或者可以通过它导出私钥。
  • 把 window.ethereum 是否存在当作「用户已授权」的判断依据。
  • 把资产安全寄托在「钱包会拦下恶意请求」的假设上,从而省略操作内容的核对提示。
  • 用「方法存在」推断本次操作被允许,把能力探测结果当成安全结论。
  • 对钱包方法的可用性做硬编码假设,遇到 4200 时直接抛出未处理的异常。

面试官追问

  1. 页面被注入恶意脚本后,攻击者通过 Provider 能发起什么?哪些请求会进入钱包确认流程?
  2. 如果前端校验不能作为安全防线,它还有哪些价值?
  3. 在同一台机器安装多个钱包扩展的环境里,DApp 如何拿到与当前连接对应的 Provider?
  4. 钱包未实现某个方法(返回 4200)时,产品上可以设计哪些降级路径?
  5. 一次涉及资产的请求从页面发出到最终确认,你认为责任如何划分?

评分标准

初级回答

  • 能说出 Provider 的职责是转发请求并发出链与账户事件。
  • 知道密钥与签名在钱包侧完成,DApp 拿到的是地址与签名结果。

中级回答

  • 能说明 EIP-1193 的接口面是一个 request 与五个事件,方法覆盖度取决于钱包实现。
  • 能解释页面环境中的 Provider 为什么不能充当安全边界,并给出 4200 场景下的降级思路。

高级回答

  • 能说明 XSS 后钱包可能收到恶意请求,确认弹窗取决于钱包和权限设置,不能作为唯一安全边界。
  • 能给出能力探测与安全判断分离的实现方案,并讨论由此带来的体验取舍。
  • 能设计请求限流、重复请求防护与错误分类处理,并说明监控与日志脱敏的落地方式。

参考资料

发现这道题有问题? 反馈此题