← 返回

自持钱包 · DApp 入口

Decode before you sign./No blind approvals./Server never sees the request.

用户DApp 网页手机 App本地后端接口wallet-api区块链连接 1–3看清再签 4–7签名上链 8–9授权管理 10–11被骗止损 12–13连接请求黑名单放行签名请求翻成人话确认上链Approval 事件签给了钓鱼合约资产被转走去取消授权打开 DApp内置浏览器或扫码电脑网页用扫码建立连接内置浏览器注入接口EIP-1193WalletConnect 加密下发名单DApp 收录 + 钓鱼黑名单App 本地缓存域名过黑名单命中直接拦未收录站点标风险发签名请求转账 / 授权 / 消息签名解码请求认出授权对象和额度approve 选择器0x095ea7b3看人话确认页授权给谁、多少、哪个币无限额标红按需额度默认改成本次需要的数用户可以自己再改本地签名私钥不出手机签名结果回传 DApp授权上链生效对方合约拿到额度之后随时能划走查授权列表扫 Approval 事件按地址汇总授权管理页列出所有授权过的合约一键把额度改成 0钓鱼合约划走代币签的是授权,不是转账当时余额看不出异常发现被盗先取消剩下的授权剩余资产转到新地址12345678910111213

手机上可以左右滑动看全图。

异常处理

异常处理

问题方案
钓鱼网站结论:黑名单挡一道,翻成人话兜底
现象:用户打开的是钓鱼网站
第一道:域名过钓鱼黑名单,命中直接拦
漏洞:挡不住刚冒出来的新域名
第二道(真兜底):把签名请求翻成人话,让用户自己看清在授权什么
无限额授权结论:无限额标红,默认只授本次额度
现象:签名请求是一笔无限额授权
认:解码出被授权的合约地址和额度,额度等于 uint256 最大值就是无限额
做:确认页标红;默认改成本次需要的额度,用户可再改
伪装成登录结论:EIP-712 结构化消息也要解析,认出 Permit 就标红
现象:看着只是一段「登录消息」,其实是授权
原因:Permit 类签名(EIP-2612、Permit2)不用上链,对方拿着签名就能划走代币
做:结构化消息(EIP-712)也解析,认出 Permit 翻成人话、标红
已签无限授权结论:撤不回,只能覆盖成 0,越早越好
现象:已经给钓鱼合约签了无限额授权
做:授权管理页把额度改成 0
注意:这是一笔要付手续费的链上交易
资产被转走结论:追不回,先断后续授权再转移资产
现象:资产已经被转走
做:① 立刻取消剩下的授权 ② 剩余资产转到新地址
边界:链上转账追不回;服务端没有私钥,也冻结不了别人的地址
会话被拿结论:对方拿到会话也替不了用户签名
现象:WalletConnect 会话被别人拿到
原因:会话端到端加密;每一笔签名请求都要用户在手机上点确认
服务端被攻破结论:最坏漏拦一个域名,第二道照样生效
现象:服务端被攻破,下发了假名单
影响:某个钓鱼域名没被拦住
兜底:「翻成人话」照样生效;签名请求不经过服务端,服务端改不了用户签的内容