一、常见漏洞类型与通俗解释
1. 重入攻击(Reentrancy) 🌀
通俗解释:就像你去银行取钱,柜台人员先给你钱,然后再记账。你拿到钱后立即又要求取钱,由于账还没记,柜台又给你一次钱,这样循环下去你就能拿走银行所有的钱。
漏洞原理:合约在更新状态前调用外部合约,允许攻击者递归调用提款函数
典型代码:
Solidity
function withdraw() public {uint bal = balances[msg.sender];require(bal > 0);(bool sent, ) = msg.sender.call{value: bal}(""); // 漏洞点:先转账后更新余额require(sent, "Failed to send Ether");balances[msg.sender] = 0;
}
2. 整数溢出/下溢(Integer Overflow/Underflow) 🔢
通俗解释:就像汽车里程表,当超过最大值时会从零重新开始。如果你有0元,再花1元,余额会变成非常大的数字。
漏洞原理:算术运算结果超出变量范围导致意外行为
典型代码:
Solidity
uint8 public balance = 255;
balance += 1; // 溢出后balance变为0
3. 访问控制缺陷(Access Control) 🔓
通俗解释:就像你家门锁坏了,任何人都能进来拿东西。智能合约中如果没有权限检查,任何人都能调用关键函数。
漏洞原理:敏感函数缺乏适当的权限检查
典型代码:
Solidity
function transferOwnership(address _newOwner) public {owner = _newOwner;// 没有检查msg.sender是否是当前owner
}
4. 时间戳依赖(Timestamp Dependency) ⏰
通俗解释:就像用不准确的闹钟来决定发工资时间,矿工可以稍微调整时间让你提前或延后拿到工资。
漏洞原理