Token Approval 原理与风险|从 ERC20 approve 到一份完整防御指南
Token Approval 是 ERC20 标准里 approve(spender, amount) 方法——授权 spender 从你账户转走最多 amount 的代币。本文按 8 个维度深度拆解:原理、风险、Unlimited、Permit、setApprovalForAll、撤销策略、审计周期。
Token Approval 的原理与风险是什么?直接答:ERC20 标准的 approve(spender, amount) 方法允许某个 spender 从你账户里转走最多 amount 数量的代币——这是 DEX、DeFi 协议、桥的前置必经步骤。核心风险:approve 一次终身有效(直到主动 set 0 或 spender 用完),合约升级、漏洞、钓鱼都可能让授权额度内的资产被偷。完整防御策略:用完即撤、Unlimited 限制使用、定期审计、警惕 setApprovalForAll 与 Permit。
如果你做完授权审计后想把资产转去交易所暂存,可顺路准备 币安官网 的实名账号,并用 币安官方App 看充币地址。下载入口在 下载页。
第 1 步:理解 approve 的根本设计
A:ERC20 是标准接口——它定义 transfer / transferFrom / approve / allowance 4 个核心方法。
| 方法 | 谁调 | 作用 |
|---|---|---|
| transfer(to, amount) | owner | 直接转给 to |
| approve(spender, amount) | owner | 授权 spender 能转 |
| transferFrom(from, to, amount) | spender | 用授权额度转 |
| allowance(owner, spender) | 任何人查 | 查当前剩余授权额度 |
为什么不直接 transfer 给 DEX:DEX 收到 transfer 后没法自动「触发兑换」——智能合约需要用户主动调用方法。所以流程是「approve → 调用 swap 方法 → swap 内调 transferFrom 拿你的币」。
第 2 步:approve 的 4 类风险
| 风险 | 触发条件 | 严重度 |
|---|---|---|
| 合约漏洞 | spender 合约有 bug | 中 |
| 合约升级 | spender 是 Proxy 升级到恶意逻辑 | 高 |
| 钓鱼合约 | 你 approve 给伪装成正常 DEX 的钓鱼合约 | 极高 |
| Permit 离线签 | 钓鱼网站让你签 Permit | 极高 |
A:真实损失中钓鱼合约 + Permit 占 80%——最常见的攻击向量。普通用户只要警惕这两个,能避免大多数授权损失。
第 3 步:Unlimited Approve 的真实风险
很多 DEX UI 默认勾选「Approve Unlimited」——一次授权 uint256 max(约 1.16e77)。
| 优点 | 缺点 |
|---|---|
| 后续兑换不再 approve(省 Gas) | 无限暴露资产 |
| 简化用户体验 | 合约升级有漏洞资产全失守 |
安全做法:
| 方案 | 说明 |
|---|---|
| 用完即撤 | 兑换完立即 approve(spender, 0) |
| 限额 approve | 每次 approve 实际用量 |
| 多钱包隔离 | 主钱包不去 DEX,操作钱包小额 |
第 4 步:setApprovalForAll 的极高风险
NFT 标准 ERC721 / ERC1155 的授权是 setApprovalForAll(operator, true)——一次签名授权 operator 转走整个 collection 的全部 NFT。
| 场景 | 风险 |
|---|---|
| OpenSea 卖 NFT | 给 OpenSea Conduit setApprovalForAll = 正常 |
| Blur 挂单 | 给 Blur 合约 setApprovalForAll = 正常 |
| 陌生网站要 setApprovalForAll | 100% 钓鱼 |
| 给 EOA setApprovalForAll | 100% 钓鱼 |
A:setApprovalForAll 给 EOA = 那个 EOA 能随时偷走你所有 NFT——这是 NFT 钓鱼最常见手法。
第 5 步:Permit(EIP-2612)的隐蔽风险
Permit 是「离线签名授权」——不上链不花 Gas,但效力等同于 approve。
| 步骤 | 攻击 |
|---|---|
| 1 | 钓鱼网站让你「签个名进站」 |
| 2 | MetaMask 弹窗显示 Permit signature |
| 3 | 你以为是登录,实际是授权 |
| 4 | 钓鱼者拿到签名后调 permit + transferFrom |
| 5 | 你的 USDT/USDC 被偷走 |
A:MetaMask 弹窗里 0xd505accf 开头的签名 = Permit。任何不熟悉网站要 Permit,立即关闭浏览器。
第 6 步:完整撤销策略
| 频率 | 动作 |
|---|---|
| 每月 | Approval Checker 看一遍,撤可疑 |
| 每季度 | 把所有 Unlimited 撤回 |
| 大额操作前 | 临时 approve,操作后立即撤 |
| 切换主钱包 | 旧钱包剩余资产转到新钱包 |
| 怀疑被钓 | 立即撤所有授权 + 转走所有资产 |
第 7 步:用 Approval Checker 工具
| 工具 | 链 | 价格 |
|---|---|---|
| Etherscan Approval Checker | ETH 主网 | 免费 |
| BscScan Approval Checker | BSC | 免费 |
| Polygonscan Approval Checker | Polygon | 免费 |
| Revoke.cash | 多链 | 免费 |
| OKLink token approval | 多链 | 免费 |
详见 Etherscan 用法 分类的查我所有授权篇。
第 8 步:撤销时的 Gas 成本
| 链 | 单笔撤销 Gas | 备注 |
|---|---|---|
| ETH 主网 | 0.0005-0.005 ETH | 看 Gas Price |
| BSC | 0.00005-0.0001 BNB | 极便宜 |
| Polygon | 0.001-0.01 MATIC | 几分钱 |
| Arbitrum | 0.0001-0.0005 ETH | L2 便宜 |
ETH 主网撤销策略:选凌晨 UTC 0-6 点 Gas 低谷批量做。
实战:发现被钓鱼后的紧急 6 步
| 步骤 | 操作 | 时间 |
|---|---|---|
| 1 | 立即在新干净浏览器创建新钱包 | 5 分钟 |
| 2 | 把可移动资产转到新钱包 | 视 Token 数 |
| 3 | 在 Etherscan Approval Checker 撤所有授权 | 视授权数 |
| 4 | 关闭可能被钓鱼的浏览器档案 | 即刻 |
| 5 | 检查所有连过的 DApp 是否还有 session | 视情况 |
| 6 | 长期:换主钱包,旧钱包用作隔离 | 长期 |
风险提示
approve 后即使 spender 是 Verified 合约,合约升级、漏洞、社交工程攻击仍可能让资产被偷。真正安全的做法是「分多个钱包,主钱包不去任何不熟悉合约」——把日常 DApp 操作放到操作钱包。
如果资产想出金,可借助 币安官网 走 C2C。
实操核对清单
- [ ] 已了解 approve 的 4 个 ERC20 方法
- [ ] 知道 4 类授权风险
- [ ] Unlimited 已设月度审计
- [ ] setApprovalForAll 只给主流市场
- [ ] Permit (0xd505accf) 永远警觉
- [ ] 已建立多钱包隔离策略
一站式回顾
A:Token Approval 原理 = ERC20 的「分权」机制 + 4 个方法。风险:合约漏洞、升级、钓鱼合约、Permit。核心防御:用完即撤、Unlimited 限制、setApprovalForAll 谨慎、Permit 警觉、多钱包隔离。核心 1 个心法:永远在 MetaMask 弹窗前看清 spender + amount——慢一点签。
如果想了解 Etherscan 上具体撤销操作步骤,下一步建议看 Etherscan 查我所有授权的具体路径篇。
常见问题
approve 与 transfer 的根本区别?
A:transfer 是「直接转账」——你转给谁谁就有了;approve 是「授权」——给 spender 一个「能从你账户转 X 数量」的权限。transfer 一次性,approve 是持续到撤为止。
为什么 ERC20 不能直接 transfer 给 DEX?
A:能 transfer 但 DEX 没法自动触发兑换——transfer 只是简单转账,不会调用 DEX 的 swap 方法。这是 ERC20 设计的「不优雅」。ERC777 和后来的方案试图改进。
Unlimited approve 真的会被偷吗?
A:可能性低但存在。已知 DEX(Uniswap、SushiSwap、Curve 等)合约稳定运营 4+ 年没事故——Unlimited 给它们风险低。给小项目或新合约时风险陡增。
我能不能在签名前预览 Permit 内容?
A:能。MetaMask 等钱包的弹窗会显示 Permit 的 spender、value、deadline——关键是用户要细看,而不是直接 Sign。很多用户被钓鱼是因为习惯性快速点击。
approve 给「Multicall」合约安全吗?
A:通常安全。Multicall(如 Multicall3)是公开标准合约——只是把多个调用打包,本身不会偷资产。给它的 approve 不是真正的资产风险源。
撤销 Unlimited 后下次又变 Unlimited 怎么办?
A:手动调 approve 时输入「实际用量」而不是「最大值」。很多 DEX UI 默认勾选 Unlimited——找到那个选项手动改。MetaMask 弹窗里也能编辑数量。
多钱包隔离真的有用吗?
A:极有用。主钱包(冷钱包)只装资产,不连任何 DApp——攻击面 = 0。操作钱包(热钱包)小额日常用——被钓最多失去这点钱。这是高级用户的标准做法。
文档发布于 2026-05-08,下次复测计划 2026-08-08(约每 90 天回访一次,确认 ERC20 标准 approve / approve 与 Permit 钓鱼模式未变)。