-
Bitcoin
$108,891.3753
-0.50% -
Ethereum
$2,548.3174
-2.13% -
Tether USDt
$1.0003
-0.03% -
XRP
$2.2232
-2.42% -
BNB
$657.2641
-0.76% -
Solana
$150.7568
-3.12% -
USDC
$0.9999
0.00% -
TRON
$0.2856
0.49% -
Dogecoin
$0.1672
-4.19% -
Cardano
$0.5811
-4.13% -
Hyperliquid
$38.4739
-5.37% -
Sui
$2.9442
-3.48% -
Bitcoin Cash
$477.8065
-5.39% -
Chainlink
$13.4086
-3.31% -
UNUS SED LEO
$9.0399
0.42% -
Avalanche
$18.1715
-5.05% -
Stellar
$0.2383
-2.89% -
Toncoin
$2.7988
-3.99% -
Shiba Inu
$0.0...01160
-4.27% -
Litecoin
$87.4320
-3.18% -
Hedera
$0.1552
-3.05% -
Monero
$321.3338
-1.41% -
Polkadot
$3.4578
-5.50% -
Dai
$1.0000
-0.01% -
Ethena USDe
$1.0002
0.00% -
Bitget Token
$4.4673
-3.06% -
Uniswap
$7.3193
-5.10% -
Aave
$271.3030
-3.63% -
Pepe
$0.0...09707
-8.22% -
Pi
$0.4810
-3.58%
什麼是重新進入攻擊?如何防止這種脆弱性?
重新進入攻擊利用智能合同缺陷,允許在狀態解決之前重複呼叫,導致未經授權的措施;防止檢查效應互動模式。
2025/04/12 00:35

重新進入攻擊是智能合約,尤其是以太坊區塊鏈上的一種安全漏洞。此攻擊利用了合同邏輯中的缺陷,該缺陷允許攻擊者在完全解決初始呼叫之前反複調用功能。這可能導致未經授權的戒斷或其他惡意行動。在本文中,我們將探討重新進入攻擊的機制,檢查現實世界的示例,並提供有關如何防止智能合約中這種脆弱性的詳細指導。
了解重新進入攻擊
當智能合約在解決自己的狀態之前,智能合約調用外部合同時,就會發生重新攻擊。這可以為外部合同創造一個機會窗口,以重新獲得原始合同並操縱其狀態。襲擊通常涉及一項惡意合同,該合同通過在受害者合同可以更新其餘額之前反複調用諸如withdraw()
之類的職能,從而從受害者合同中流失了資金。
為了說明,請考慮一個簡單的合同示例,該合同允許用戶存入和提取資金:
contract Vulnerable {
mapping(address => uint) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint amount) public { require(balances[msg.sender] >= amount, 'Insufficient balance'); (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); balances[msg.sender] -= amount; }
}
在此示例中, withdraw
功能首先檢查用戶是否有足夠的餘額,然後嘗試將資金發送給用戶,並最終更新用戶的餘額。漏洞在於以下事實:直到在msg.sender.call
的外部呼叫之後, balances[msg.sender]
才能更新。如果msg.sender
是惡意合同,則可以在更新余額之前重新進入withdraw
功能,允許在將餘額設置為零之前進行多次提款。
重新進入攻擊的現實示例
最臭名昭著的重新進入攻擊之一發生在2016年的DAO Hack期間。 DAO(分散的自治組織)是以太坊區塊鏈的智能合同,允許用戶投資於項目。該合同的脆弱性類似於上述合同,該合同使攻擊者從DAO中漏了大約360萬ETH。
另一個例子是2017年的奇特錢包黑客。奇偶錢包是一個流行的以太坊上流行的多簽名錢包,由於重新進入的脆弱性而被利用。攻擊者能夠從多個錢包中排出資金,從而給用戶帶來了重大損失。
如何防止重新進入攻擊
防止重新進入攻擊需要仔細設計和實施智能合約。以下是減輕這種脆弱性的一些策略:
使用檢查效應互動模式
檢查效應互動模式是編寫安全智能合約的最佳實踐。此模式可確保在執行任何外部呼叫之前進行所有狀態更改。在withdraw
功能的上下文中,這意味著在發送資金之前更新用戶的餘額:
contract Secure {
mapping(address => uint) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint amount) public { require(balances[msg.sender] >= amount, 'Insufficient balance'); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); }
}
通過在進行外部呼叫之前更新余額,合同確保在發生任何重新輸入之前正確將用戶的餘額設置為零。
使用撤回模式
防止重新進入攻擊的另一種有效方法是使用撤回模式。該合同不是直接向用戶發送資金,而是存儲提款金額,並允許用戶在以後的時間撤出資金。這種方法消除了在撤回過程中對外部呼叫的需求:
contract WithdrawalPattern {
mapping(address => uint) public balances; mapping(address => uint) public withdrawalPending; function deposit() public payable { balances[msg.sender] += msg.value; } function requestWithdrawal(uint amount) public { require(balances[msg.sender] >= amount, 'Insufficient balance'); balances[msg.sender] -= amount; withdrawalPending[msg.sender] += amount; } function withdraw() public { uint amount = withdrawalPending[msg.sender]; require(amount > 0, 'No pending withdrawal'); withdrawalPending[msg.sender] = 0; (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); }
}
在此示例中, requestWithdrawal
函數更新用戶的餘額,並將提款金額存儲在withdrawalPending
中。然後, withdraw
功能將資金發送給用戶,而沒有任何重新進入的風險。
實施重新進取後衛
重新進入後衛是防止重新進入攻擊的另一種技術。這些警衛使用狀態變量來跟踪當前是否正在執行函數。如果重新輸入功能,則警衛將阻止進一步執行:
contract ReentrancyGuard {
bool private _notEntered; constructor() { _notEntered = true; } modifier nonReentrant() { require(_notEntered, 'ReentrancyGuard: reentrant call'); _notEntered = false; _; _notEntered = true; } function withdraw(uint 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'); }
}
nonReentrant
修飾符可確保在仍在執行時withdraw
函數無法重新輸入。
測試和審核重新進入漏洞
除了採取預防措施外,至關重要的是要徹底測試和審核您的智能合約是否有重新進入脆弱性。以下是一些步驟:
- 單元測試:編寫單元測試,以模擬重新進入攻擊,以確保您的合同在這種情況下正確行為。
- 靜態分析:使用MyThril和Slither之類的工具自動檢測代碼中潛在的重新輸入漏洞。
- 手動審核:經驗豐富的智能合同審核師會查看您的代碼是否有潛在的重新輸入問題。手動審核可以發現自動化工具可能會錯過的複雜漏洞。
智能合同開發的最佳實踐
為了進一步降低重新進入攻擊的風險,請考慮以下最佳實踐:
- 保持合同簡單:複雜的合同更有可能包含漏洞。使您的合同盡可能簡單明了。
- 使用已建立的圖書館:利用審核的圖書館和框架,例如Openzeppelin ,可提供共同合同模式的安全實現。
- 定期更新:請了解最新的安全性最佳實踐,並相應地更新合同。
常見問題
問:除了以太坊以外,還可以在其他區塊鏈平台上發生重新進入攻擊嗎?
答:雖然重新進入攻擊最常見於以太坊,因為它廣泛使用了智能合約,但在支持智能合約的其他區塊鏈平台上可能會發生類似的漏洞,例如Binance Smart Chain和Solana。防止重新進入攻擊的原則在不同平台之間保持不變。
問:是否有專門設計用於檢測重新進入漏洞的工具?
答:是的,幾種工具旨在檢測智能合約中的重新輸入漏洞。 MyThril和Slither是流行的靜態分析工具,可以識別潛在的重新進入問題。此外, echidna是一種基於屬性的測試工具,可用於通過自動測試案例生成來測試重新進入漏洞。
問:如果我不是安全專家,我該如何確保我的智能合同可以防止重新進入攻擊?
答:如果您不是安全專家,強烈建議您參與專業的智能合同審核員來查看您的代碼。此外,使用諸如Openzeppelin的既定庫以及遵循最佳實踐(例如檢查效應之間的互動模式)可以大大降低重新進入脆弱性的風險。定期更新有關智能合同安全性並參與社區討論的知識也可以幫助您了解最新的安全慣例。
免責聲明:info@kdj.com
所提供的資訊並非交易建議。 kDJ.com對任何基於本文提供的資訊進行的投資不承擔任何責任。加密貨幣波動性較大,建議您充分研究後謹慎投資!
如果您認為本網站使用的內容侵犯了您的版權,請立即聯絡我們(info@kdj.com),我們將及時刪除。
- 模因硬幣,加密代幣和開玩笑的創建:紐約人的拍攝
- 2025-07-04 18:30:12
- 升級您的草坪:草種子,花園專家和1英鎊的硬幣黑客!
- 2025-07-04 18:30:12
- Sui Price在Lion Group的財政部搬家中飆升:下一步是什麼?
- 2025-07-04 16:30:13
- 令牌解鎖後,爆炸價格反彈:集會是真實的嗎?
- 2025-07-04 17:10:16
- 蟲洞,共插詞和互操作性:加密貨幣的新時代?
- 2025-07-04 16:30:13
- Neo Pepe Coin($ neop):旨在蝕比特幣和以太坊的加密模因硬幣?
- 2025-07-04 16:50:12
相關知識

什麼是用戶生成的內容(UGC)NFT平台?
2025-07-04 13:49:21
了解UGC NFT平台的概念用戶生成的內容(UGC)NFT平台是一個數字市場或生態系統,用戶可以在其中創建,薄荷和交易的無牙代幣(NFTS)代表其生產的原始數字內容的所有權。與傳統的NFT平台不同,創作者通常包括專業藝術家或開發人員,UGC NFT平台使日常用戶能夠使其創造力具有像徵性 - 與文本,圖像,音頻,視頻,視頻,模因甚至社交媒體帖子有關。這些平台通常為用戶提供直觀的工具,以將其上傳,將其轉換為NFT,並列出待售或拍賣的情況,而無需高級技術知識。區塊鏈的集成確保透明地保留出處,真實性和所有權。 UGC NFT平台的運作方式UGC NFT平台的核心功能圍繞著使個人將其個人創作變成可驗證的數字資產。這些平台通常是如何運行的:用戶使用MetAmask等加密錢包在平台上註冊。他們上傳內容 - 無論是照...

什麼是代幣生成事件(TGE)?
2025-07-04 07:14:47
了解令牌生成事件(TGE)的基礎知識代幣生成活動(TGE)是指區塊鏈項目創建並將其本地令牌分發給投資者,參與者或利益相關者的過程。該活動通常與在以太坊,二手智能鍊或其他支持智能合同的區塊鍊等平台上啟動的新加密貨幣項目有關。在TGE期間,該項目的團隊部署了一份智能合同,該合同將令牌鑄造並根據預定義的規則對其進行分配。與傳統的籌款方法(例如風險投資投資)不同,TGE允許分散參與。任何訪問區塊鍊網絡的人都可以將加密貨幣(通常是ETH或BNB)發送到指定的智能合約地址並接收令牌作為回報。 TGE背後的機制通常受項目的白皮書和令牌模型的控制。 TGE與ICO或IEO有何不同雖然初始硬幣產品(ICO)和初始交換產品(IEO)也涉及通過代幣銷售籌集資金,但TGE更多地是關於代幣的實際創建和分配,而不僅僅是籌款。在許...

什麼是Block Explorer API?
2025-07-04 05:07:36
了解Block Explorer API的作用Block Explorer API是一個至關重要的接口,使開發人員和用戶能夠與區塊鏈數據進行編程交互。與Web服務中使用的傳統API不同,Block Explorer API專門提供了對區塊鏈相關信息的訪問,例如交易詳細信息,錢包餘額,區塊確認和智能合約交互。這些API充當區塊鍊網絡和外部應用程序之間的橋樑,允許實時查詢和分析。 Block Explorer API的關鍵功能之一是以結構化格式(通常是JSON或XML)檢索和顯示鏈上數據。這使開發人員可以構建工具,儀表板和監視系統,而無需手動運行完整的節點或解析原始區塊鏈數據。 Block Explorer API如何工作? Block Explorer API的操作圍繞暴露與特定區塊鏈查詢相對應的端...

什麼是槓桿產量的耕作?
2025-07-04 09:36:01
了解槓桿產量的耕作槓桿產量養殖是一種更先進的產量養殖形式,這本身就是分散融資(DEFI)生態系統中一種流行的方法,可以通過為各種協議提供流動性來賺取回報。在傳統的產量耕作中,用戶通常以治理令牌或利息的形式將令牌存入Defi平台並獲得回報。但是,隨著槓桿產量的耕作,用戶通過從貸款平台上借入額外資金並將其與自己的資本一起使用,從而擴大了潛在回報。該策略可以提供更高的流動性提供,因此可能會增加更大的獎勵,但由於借用的組成部分,它也大大增加了風險。槓桿背後的機制產量耕作要了解槓桿產量如何工作,請考慮以下簡化的方案:用戶將1 ETH作為抵押在Defi Lending平台上。該平台允許他們藉用該值的70%,例如0.7 ETH。然後,他們將原始的1 ETH結合在一起,並藉用了0.7 ETH,為產量養殖池提供流動性。...

什麼是對衍生品的開放興趣?
2025-07-03 14:49:19
了解對衍生品的開放興趣開放興趣是加密貨幣衍生品市場中使用的關鍵指標,尤其是在分析期貨和期權合同時。它代表了涉及任何一方未解決或關閉的未償還合同的總數。與交易量不同,該交易量算在一天內進行的所有交易,開放興趣集中在任何給定時間的主動頭寸總數。該指標可幫助交易者了解特定加密貨幣衍生品背後的流動性和市場情緒。開放興趣的上升通常表明對合同的利息日益增加,而下降可能表明交易者正在關閉其頭寸。開放興趣對於衡量金錢是流入還是從特定資產中流出特別有用。開放利息是如何計算的?計算開放興趣涉及跟踪尚未確定的合同總數。每次兩方簽訂新的期貨或期權合約時,開放利息就會增加一個。相反,如果雙方決定退出現有職位,則開放利息將減少一個。重要的是要注意,僅計算交易的一側- 這意味著不同時添加長時間和短職位。每個合同都有一個買方和賣方,...

什麼是資金率套利?
2025-07-04 11:43:16
了解加密貨幣市場中的資金率套利資金利率套利是加密貨幣交易者採用的一種交易策略,以利用各種永久期貨交易所的資金率差異。在永久合同中,籌資率是長期和短交易者之間的定期付款,具體取決於資產的價格高於現貨價格還是低於現貨價格。當這些平台之間的這些利率差異很大時,精明的交易者可以在不同的交流上開放對立立場,以捕獲無風險的利潤。這種類型的套利不涉及定向市場風險,使其對算法和定量交易者有吸引力。關鍵在於在任何給定時間確定資金率的差異,並精確地執行交易,以確保從一個職位上的收益抵消了另一個位置損失(如果有)。資金率如何在永久期貨中起作用與傳統期貨不同,永久期貨合約沒有到期日期。為了保持這些合同的價格與基礎資產的現貨價格保持一致,交易所使用了一種稱為融資率的機制。此費率決定了交易者每隔幾個小時的付款或每8小時的付款或接...

什麼是用戶生成的內容(UGC)NFT平台?
2025-07-04 13:49:21
了解UGC NFT平台的概念用戶生成的內容(UGC)NFT平台是一個數字市場或生態系統,用戶可以在其中創建,薄荷和交易的無牙代幣(NFTS)代表其生產的原始數字內容的所有權。與傳統的NFT平台不同,創作者通常包括專業藝術家或開發人員,UGC NFT平台使日常用戶能夠使其創造力具有像徵性 - 與文本,圖像,音頻,視頻,視頻,模因甚至社交媒體帖子有關。這些平台通常為用戶提供直觀的工具,以將其上傳,將其轉換為NFT,並列出待售或拍賣的情況,而無需高級技術知識。區塊鏈的集成確保透明地保留出處,真實性和所有權。 UGC NFT平台的運作方式UGC NFT平台的核心功能圍繞著使個人將其個人創作變成可驗證的數字資產。這些平台通常是如何運行的:用戶使用MetAmask等加密錢包在平台上註冊。他們上傳內容 - 無論是照...

什麼是代幣生成事件(TGE)?
2025-07-04 07:14:47
了解令牌生成事件(TGE)的基礎知識代幣生成活動(TGE)是指區塊鏈項目創建並將其本地令牌分發給投資者,參與者或利益相關者的過程。該活動通常與在以太坊,二手智能鍊或其他支持智能合同的區塊鍊等平台上啟動的新加密貨幣項目有關。在TGE期間,該項目的團隊部署了一份智能合同,該合同將令牌鑄造並根據預定義的規則對其進行分配。與傳統的籌款方法(例如風險投資投資)不同,TGE允許分散參與。任何訪問區塊鍊網絡的人都可以將加密貨幣(通常是ETH或BNB)發送到指定的智能合約地址並接收令牌作為回報。 TGE背後的機制通常受項目的白皮書和令牌模型的控制。 TGE與ICO或IEO有何不同雖然初始硬幣產品(ICO)和初始交換產品(IEO)也涉及通過代幣銷售籌集資金,但TGE更多地是關於代幣的實際創建和分配,而不僅僅是籌款。在許...

什麼是Block Explorer API?
2025-07-04 05:07:36
了解Block Explorer API的作用Block Explorer API是一個至關重要的接口,使開發人員和用戶能夠與區塊鏈數據進行編程交互。與Web服務中使用的傳統API不同,Block Explorer API專門提供了對區塊鏈相關信息的訪問,例如交易詳細信息,錢包餘額,區塊確認和智能合約交互。這些API充當區塊鍊網絡和外部應用程序之間的橋樑,允許實時查詢和分析。 Block Explorer API的關鍵功能之一是以結構化格式(通常是JSON或XML)檢索和顯示鏈上數據。這使開發人員可以構建工具,儀表板和監視系統,而無需手動運行完整的節點或解析原始區塊鏈數據。 Block Explorer API如何工作? Block Explorer API的操作圍繞暴露與特定區塊鏈查詢相對應的端...

什麼是槓桿產量的耕作?
2025-07-04 09:36:01
了解槓桿產量的耕作槓桿產量養殖是一種更先進的產量養殖形式,這本身就是分散融資(DEFI)生態系統中一種流行的方法,可以通過為各種協議提供流動性來賺取回報。在傳統的產量耕作中,用戶通常以治理令牌或利息的形式將令牌存入Defi平台並獲得回報。但是,隨著槓桿產量的耕作,用戶通過從貸款平台上借入額外資金並將其與自己的資本一起使用,從而擴大了潛在回報。該策略可以提供更高的流動性提供,因此可能會增加更大的獎勵,但由於借用的組成部分,它也大大增加了風險。槓桿背後的機制產量耕作要了解槓桿產量如何工作,請考慮以下簡化的方案:用戶將1 ETH作為抵押在Defi Lending平台上。該平台允許他們藉用該值的70%,例如0.7 ETH。然後,他們將原始的1 ETH結合在一起,並藉用了0.7 ETH,為產量養殖池提供流動性。...

什麼是對衍生品的開放興趣?
2025-07-03 14:49:19
了解對衍生品的開放興趣開放興趣是加密貨幣衍生品市場中使用的關鍵指標,尤其是在分析期貨和期權合同時。它代表了涉及任何一方未解決或關閉的未償還合同的總數。與交易量不同,該交易量算在一天內進行的所有交易,開放興趣集中在任何給定時間的主動頭寸總數。該指標可幫助交易者了解特定加密貨幣衍生品背後的流動性和市場情緒。開放興趣的上升通常表明對合同的利息日益增加,而下降可能表明交易者正在關閉其頭寸。開放興趣對於衡量金錢是流入還是從特定資產中流出特別有用。開放利息是如何計算的?計算開放興趣涉及跟踪尚未確定的合同總數。每次兩方簽訂新的期貨或期權合約時,開放利息就會增加一個。相反,如果雙方決定退出現有職位,則開放利息將減少一個。重要的是要注意,僅計算交易的一側- 這意味著不同時添加長時間和短職位。每個合同都有一個買方和賣方,...

什麼是資金率套利?
2025-07-04 11:43:16
了解加密貨幣市場中的資金率套利資金利率套利是加密貨幣交易者採用的一種交易策略,以利用各種永久期貨交易所的資金率差異。在永久合同中,籌資率是長期和短交易者之間的定期付款,具體取決於資產的價格高於現貨價格還是低於現貨價格。當這些平台之間的這些利率差異很大時,精明的交易者可以在不同的交流上開放對立立場,以捕獲無風險的利潤。這種類型的套利不涉及定向市場風險,使其對算法和定量交易者有吸引力。關鍵在於在任何給定時間確定資金率的差異,並精確地執行交易,以確保從一個職位上的收益抵消了另一個位置損失(如果有)。資金率如何在永久期貨中起作用與傳統期貨不同,永久期貨合約沒有到期日期。為了保持這些合同的價格與基礎資產的現貨價格保持一致,交易所使用了一種稱為融資率的機制。此費率決定了交易者每隔幾個小時的付款或每8小時的付款或接...
看所有文章
