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 时直接抛出未处理的异常。
面试官追问
- 页面被注入恶意脚本后,攻击者通过 Provider 能发起什么?哪些请求会进入钱包确认流程?
- 如果前端校验不能作为安全防线,它还有哪些价值?
- 在同一台机器安装多个钱包扩展的环境里,DApp 如何拿到与当前连接对应的 Provider?
- 钱包未实现某个方法(返回 4200)时,产品上可以设计哪些降级路径?
- 一次涉及资产的请求从页面发出到最终确认,你认为责任如何划分?
评分标准
初级回答
- 能说出 Provider 的职责是转发请求并发出链与账户事件。
- 知道密钥与签名在钱包侧完成,DApp 拿到的是地址与签名结果。
- 能说明 EIP-1193 的接口面是一个
request 与五个事件,方法覆盖度取决于钱包实现。
- 能解释页面环境中的 Provider 为什么不能充当安全边界,并给出 4200 场景下的降级思路。
高级回答
- 能说明 XSS 后钱包可能收到恶意请求,确认弹窗取决于钱包和权限设置,不能作为唯一安全边界。
- 能给出能力探测与安全判断分离的实现方案,并讨论由此带来的体验取舍。
- 能设计请求限流、重复请求防护与错误分类处理,并说明监控与日志脱敏的落地方式。
参考资料