web3系列——重入攻击(solidity)

我们的BNB3项目目前处于推广阶段了!希望尊敬的各位程序员来加入!

最近DEXX被盗了😂,我又双叒开始入门合约安全!确实,在web2似乎很少遇见hacker,但是在新的领域,真的需要各位优秀的程序员加入!!

什么是智能合约中的重入攻击?如何防范这种攻击?

防范措施:

  • 使用 Checks-Effects-Interactions 模式:先进行检查,修改合约状态,再与外部合约交互。
  • 使用 Reentrancy Guard:通过在合约中引入状态标志,防止重入调用。

攻击原理

  1. 合约 A 调用合约 B 的一个函数,转账或执行其他逻辑。
  2. 合约 B 在逻辑中调用外部合约 C(通常是攻击者的合约)。
  3. 合约 C 的回调函数再次调用合约 A 的函数,而此时合约 A 尚未完成状态更新,可能导致重复执行敏感逻辑(例如转账资金),从而被攻击者多次利用。

Vulnerable 合约

这是一个简单的提款合约,用户可以存款并提取他们的余额,但存在重入漏洞。

Attacker 合约 攻击者合约通过构造恶意逻辑,在回调函数中反复调用 withdraw 函数,窃取 Vulnerable 合约的资金。

解决办法

  • 将状态更新放在外部调用之前(采用检查-效应-交互模式)。

    solidity 复制代码
    function withdraw(uint256 amount) public nonReentrant {
        require(balances[msg.sender] >= amount, "Insufficient balance");
    
        // 更新余额
        balances[msg.sender] -= amount;
    
        // 转账操作
        (bool success, ) = msg.sender.call{value: amount}("");
        require(success, "Transfer failed");
    }
  • 使用 OpenZeppelin 的 ReentrancyGuard 防止重入攻击。

solidity 复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract SecureContract is ReentrancyGuard {
    mapping(address => uint256) public balances;

    // 用户存款
    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    // 防止重入的提款函数
    function withdraw(uint256 amount) public nonReentrant {
        require(balances[msg.sender] >= amount, "Insufficient balance");

        // 更新余额
        balances[msg.sender] -= amount;

        // 执行外部调用
        (bool success, ) = msg.sender.call{value: amount}("");
        require(success, "Transfer failed");
    }

    // 获取合约余额
    function getContractBalance() public view returns (uint256) {
        return address(this).balance;
    }
}

ps: BNB3平台在测试上线了,欢迎各位来玩😊

相关推荐
m0_547486661 天前
《Web开发技术基础》全套PPT课件2026
web3·web开发
徐征6393 天前
邮件安全防护体系技术拆解:从入口过滤到大模型研判的检测流水线 北京方向标
web3·生活
米小虾3 天前
币安 63 亿美元被盗:被攻破的不是私钥,是那台负责签名的机器
黑客·web3
OxYGC5 天前
[Web3] 的⛽ Gas 革命:五大协议群组如何终结“Gas 痛点
web3·1024程序员节·layer2·gas·erc-4337
OxYGC5 天前
[Web3] 去中心化基石 - BIP铁三角(BIP32/39/44)
web3·1024程序员节·钱包·bip32·bip44
磐链科技5 天前
IM聊天Web3钱包定制开发指南:从业务场景梳理、系统功能规划到产品迭代与生态扩展
web3
limit00757 天前
三维 WebGIS 工具选型:加载、样式、分析、交付,一套界面能做完什么
android·前端·web3·安卓·webgl
木西7 天前
dAppOS 意图执行网络核心技术剖析:从智能账户、生息资产金库到 OMS 乐观质押仲裁的 Solidity 0.8.28 实现
web3·智能合约·solidity
limit00757 天前
公开 WMTS / XYZ 瓦片接入 Cesium:6 类常见问题与排查顺序
chrome·低代码·arcgis·web3·旅游
limit00758 天前
三维模型悬空与切片偏移的排查顺序
低代码·3d·arcgis·web3·安卓·webgl