理解重入攻擊及如何防止它們 🔐

robot
摘要生成中

重入攻擊乍一看似乎很棘手。讓我用簡單的術語爲您分解一下,並向您展示一些保護您的智能合約的方式 🛡️

什麼是重入攻擊? 🧐

這發生在 ContractB 在 ContractA 仍在運行時回調 ContractA。這很麻煩。攻擊者喜歡這個漏洞來從合約中抽取資金 💸

想象一下:

  • 合約 A 持有 10 ETH
  • 合約 B 投入 1 ETH
  • ContractB 然後偷走所有東西

攻擊機制 🕵️‍♂️

你需要兩個關鍵的東西:

  1. attack() 函數來啓動這一切
  2. fallback() 函數用於狡詐部分

流程如下:

  1. 合約 B 啓動 attack(),調用合約 A 的withdraw()
  2. 合約 A 檢查合約 B 的餘額
  3. 合約 A 向合約 B 發送 ETH
  4. 這會觸發 ContractB 的 fallback()
  5. 循環繼續。錢沒了 🚨

這有點令人驚訝,雖然簡單卻可能造成毀滅性的後果。

易受攻擊的代碼示例 📝

這就是一個脆弱合約的樣子: 堅固 函數 withdrawAll() public { uint bal = 餘額[msg.sender]; require(bal > 0);

(bool發送,) = msg.sender.call{value: bal}(“”); require(sent, "發送以太幣失敗");

餘額[msg.sender] = 0;發送後更新?大錯! }

攻擊合約的作用是: 堅固 fallback() 外部應付 { if(etherStore.balance >= 1 ether) etherStore.withdrawAll019283746574839201(; }

函數 attack)( external payable { 需求019283746574839201msg.value >= 1 ether); etherStore.deposit{value: 1 ether}(); etherStore.withdrawAll019283746574839201(; }

三種方法來阻止這些攻擊 🛡️

) 1.nonReentrant 修飾符 🔒

堅固 bool private locked = false;

修飾符 nonReentrant() { require###!locked, “No reentrancy”(; 鎖定 = true; _; 鎖定 = false; }

將其添加到易受攻擊的函數中。簡單但有效。

) 2. 檢查-效果-交互模式 📊

這很關鍵:

堅固 函數 withdrawAll() public { uint bal = 餘額[msg.sender]; require###bal > 0(;

餘額[msg.sender] = 0;首先更新

)bool發送,( = msg.sender.call{value: bal})“”(;然後交互 require)sent, "發送以太幣失敗"(; }

先更新你的狀態。稍後再互動。永遠如此。

) 3. 全球保護 🌐

對於更大的項目:

堅固 合約 GlobalReentrancyGuard { bool private locked = false;

修飾符 globalNonReentrant() { require###!locked, “No reentrancy”(; 鎖定 = true; _; 鎖定 = false; } }

讓你所有的智能合約繼承這個。更安全的生態系統。

最新趨勢 🔥

截至2025年9月,這些攻擊仍然困擾着DeFi。開發者爲什麼總是犯同樣的錯誤並不完全清楚。像Slither這樣的工具可以發現這些問題。Echidna和Foundry幫助測試它們🚀

安全不僅僅是添加一個修飾符。這是一種心態。

保持警惕!🛡️

ETH3.65%
查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 留言
  • 轉發
  • 分享
留言
0/400
暫無留言
交易,隨時隨地
qrCode
掃碼下載 Gate App
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)