m mybian.xyz
REPORT · 新手必看重入攻击 · 行业洞察
新手必看重入攻击 · INSIGHTS

新手必看重入攻击:原理、典型案例与智能合约防护实战

新手必看重入攻击全解析:本文从零讲清重入攻击的原理、发生机制、复现步骤、危害与防护方案(检查-生效-交互、重入锁),帮助合约开发者与 DeFi 用户理解这一经典安全漏洞与风险。

新手必看重入攻击 - 新手必看重入攻击:原理、典型案例与智能合约防护实战
1615
字数
~4
阅读时长
1
章节
2026
版本
DOCUMENT ID · xin-shou-bi-kan-zhong-ru-gong-ji PUBLISHED · 2026-05-24T06:50:42.959408+00:00 UPDATED · 2026-06-11T10:59:11.960411+00:00

Executive Summary

新手必看重入攻击全解析:本文从零讲清重入攻击的原理、发生机制、复现步骤、危害与防护方案(检查-生效-交互、重入锁),帮助合约开发者与 DeFi 用户理解这一经典安全漏洞与风险。

什么是重入攻击

重入攻击(Reentrancy Attack)是智能合约领域最著名、危害也最大的漏洞之一。它的核心在于:当一个合约在「尚未完成内部状态更新」时就向外部地址转账或调用,攻击者可以利用回调反复「重新进入」原函数,把本不该多次执行的逻辑(比如提现)重复执行,从而掏空合约资金。

对于刚接触合约安全的人来说,这是 Solidity安全新手入门 中必须啃下的第一块硬骨头。无论你走的是 Solidity基础新手入门 路线,还是从 Rust合约新手入门 切入其他链,重入的思想都是相通的:状态与外部调用的顺序错了,安全就崩了。

重入攻击的机制原理

要理解机制,先看一段有问题的提现逻辑的执行顺序:

  1. 合约先检查用户余额是否充足;
  2. 合约向用户地址转账(外部调用);
  3. 合约最后才把用户余额清零。

问题就出在第 2 步和第 3 步之间。当转账目标是一个恶意合约时,转账会触发它的 fallback/receive 回调函数。攻击者在这个回调里再次调用提现函数——此时余额还没被清零,检查依然通过,于是又转一笔。如此循环,直到合约被掏空。

这正是 闪电贷攻击新手入门 经常组合使用的手法:先用闪电贷放大本金,再通过重入反复套利。理解 抢跑交易新手入门闪电贷新手入门 的攻击者也常把重入作为攻击链的一环。

如何复现与识别

在学习阶段,安全地复现漏洞有助于建立直觉。典型步骤是:

搭建环境

用本地测试链部署一个存在漏洞的「金库」合约。配合 Alchemy新手入门 或本地节点都可以,重点是隔离的测试环境,不要在主网操作。

编写攻击合约

写一个恶意合约,其 receive 函数里递归调用金库的提现方法。学习 代理合约新手入门账户抽象新手入门 时,也要注意这些复杂结构同样可能引入重入面。

触发与观察

存入小额资金后发起攻击,观察金库余额被反复提走。借助 DApp前端新手入门 搭一个简单界面能更直观地看到余额变化,但核心还是合约层的调用追踪。

危害与防护

重入的危害极其严重:历史上多个项目因此损失巨额资金,甚至引发整个生态的连锁反应。它不仅影响以太坊,凡是支持外部合约回调的链都可能中招。

防护手段主要有三类,建议组合使用:

  • 检查-生效-交互(Checks-Effects-Interactions)模式:先做所有检查,再更新内部状态(如清零余额),最后才进行外部转账。把状态更新放在外部调用之前,重入就失去了「余额未变」的可乘之机。
  • 重入锁(ReentrancyGuard):用一个状态变量给关键函数加锁,函数执行期间禁止再次进入。这是 OpenZeppelin新手入门 提供的标准方案之一,直接继承使用即可,避免自己造轮子出错。学习 OpenZeppelin使用新手入门 时这是必练项。
  • 限制外部调用:尽量使用更安全的转账方式并限制 gas,减少回调中可执行的复杂逻辑。

对于做安全审计的人,重入是 Solidity新手入门 之后的进阶必修;理解 ZKRollup新手入门Layer2新手入门 等扩容方案时,也要意识到跨层调用同样可能引入新的重入变体。

常见问题

只有 Solidity 合约才会重入吗? 不是。任何允许外部调用并回调的环境都可能存在重入风险,只是表现形式不同。用 Anchor框架新手入门 写 Solana 程序时,模型不同,但「外部调用顺序」的安全意识同样适用。

加了 ReentrancyGuard 就绝对安全吗? 不能这么绝对。重入锁只能防住「同一函数的直接重入」,跨函数重入、只读重入等变体仍需额外注意。安全没有银弹,纵深防御才是正解。

普通用户如何降低风险? 优先与经过审计、运行时间长、社区口碑好的协议交互,对新合约保持谨慎。本文仅作技术科普,不构成任何投资或操作建议,链上交互存在不可逆的资金损失风险。

小结

重入攻击的本质,是「外部调用」和「状态更新」顺序颠倒带来的可乘之机。掌握检查-生效-交互模式、善用重入锁、控制外部调用,是每个合约开发者的必修课。对新手而言,理解它不仅是为了写出安全的代码,更是为了在与 DeFi 交互时多一分对风险的敬畏。