這份智慧合約「避坑指南」建議收藏

買賣虛擬貨幣
在這篇文章中,我將分享一些基於現有漏洞而總結的小貼士,希望能讓你的智慧合約更加安全。雖然這些貼士不能確保讓你的智慧合約對駭客完全免疫,但至少可以幫助你避免一些最常見的錯誤。駭客無處不在作為一名機智的合約開發者,你的程式碼是唯一可以信任的東西。具有防備心是十分重要的。不要信任你的使用者在編寫程式碼的時候,你應該始終假設你的使用者是潛在的駭客,會盡力尋找你智慧合約中的漏洞,並會毫不猶豫地加以利用。作為一名安全研究人員和程式開發人員,我有很多被攻擊的經驗,我的經驗教訓是,無論漏洞看起來多微小,後果都可能是十分嚴重的。用程式碼解決問題
編寫一份智慧合約就像編寫 Web 應用程式一樣,你要區分前端和後端。在區塊鏈上執行的智慧合約是後端。除了合約之外,你還需要編寫一個前端應用程式作為使用者與你的智慧合約進行互動的介面。那麼問題來了,你應該在前端還是後端驗證使用者輸入呢?例如,你正在編寫一個別名服務將區塊鏈地址與人類可讀的字串連線起來。然而,如果你想控制文字的長度,那你應該在哪裡寫下格式驗證邏輯呢?前端還是後端?答案肯定是後端。這可能是個細節問題,但卻十分關鍵。雖然聽起來有點荒謬,但是你可能也需要將前端開發者當作是你的敵人,假設他們也會和駭客站在另一邊。聰明的合約開發者會在程式碼中寫下所有邏輯,我們只相信我們的程式碼。輸入長度Neo 智慧合約中的一個大問題是它儲存資料的方式。帶有一對鍵值的 Storage.put() 被用來儲存各種資料。表面上看起來,這種方式既易用又酷炫,就像我們面對的是一本字典或一副地圖一樣。但問題是,如果你在儲存資料時沒有正確地驗證金鑰格式,你就會有大麻煩了。例如,我們的 NEP5 智慧合約中有一個 “totalSupply” 關鍵字,表示該 NEP5 通證的最大值,並且在合約中有如下轉賬功能:

目前我們在 NEP5 模板中有一個長度檢查的邏輯。假設這個邏輯被有意或者無意者移除,使用者就可以輸入任何字串作為引數:

接下來,我們將 “to” 引數作為 “totalSupply” 輸入,這樣一旦這個命令被成功執行,我們就可以改變該通證的總供給量:

因此,一定要檢查每個函式的輸入格式。Neo 的交易目前是免費的,多新增幾行檢查程式碼並不會有什麼壞處。

我還認為,作為常用的資料型別,在 Neo 智慧合約中應該為地址設計特定的資料型別。

檢查目標地址

在我們開始討論這個問題之前,我想請大家先看看 NEP5 智慧合約中的轉賬功能:

當然,這不是原來的版本,我稍微修改了一下,使其容易受到某種型別的攻擊。你能解決這個問題嗎?

在相同的地址間執行 From 和 To,可能會觸發這個 bug。使用被分配給 From 和 To 的相同地址,第一個 PUT 語句將 newFromvalue 儲存到該地址。儘管如此,第二個 PUT 語句仍將該值更改為 newToVal,該值甚至比前一個 Balance 更大。這樣,你就可以憑空鑄造新的通證。

現在,你是否對智慧合約的安全性有了更深的瞭解?

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;