使用構(gòu)造函數(shù)導(dǎo)致Dapp漏洞的示例分析,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、鞏義ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的鞏義網(wǎng)站制作公司
構(gòu)造函數(shù)是一個(gè)比較特殊的函數(shù),在構(gòu)造函數(shù)里會(huì)執(zhí)行一些初始化合約是比較關(guān)鍵的功能。在Solidity 版本0.4.22之前,構(gòu)造函數(shù)是一個(gè)和合約同名的函數(shù)。所以如果在開(kāi)發(fā)過(guò)程中,合約名變了的話,如果構(gòu)造函數(shù)名沒(méi)有發(fā)生變化,原來(lái)的構(gòu)造函數(shù)就會(huì)變成常規(guī)的可以調(diào)用的函數(shù)。這就會(huì)導(dǎo)致合約漏洞。
合約名變了的話,或者構(gòu)造函數(shù)有一個(gè)輸入錯(cuò)誤,這會(huì)導(dǎo)致函數(shù)名和合約名不一致。這個(gè)時(shí)候,構(gòu)造函數(shù)就是一個(gè)常規(guī)的函數(shù)。如果構(gòu)造函數(shù)里執(zhí)行了一些已授權(quán)的專有操作,就會(huì)導(dǎo)致嚴(yán)重的后果??纯聪旅娴暮霞s代碼:
contract OwnerWallet { address public owner; //constructor function ownerWallet(address _owner) public { owner = _owner; } // fallback. Collect ether. function () payable {} function withdraw() public { require(msg.sender == owner); msg.sender.transfer(this.balance); } }
這個(gè)合約接受ether充值,并且僅允許合約所有者可以用withdraw()函數(shù)提取。如果構(gòu)造函數(shù)變成了常規(guī)函數(shù)的話,任何用戶都可以調(diào)用ownerWallet函數(shù),把他們自己設(shè)置成為合約的所有者,然后調(diào)用withdraw提取合約里所有的資金。
這個(gè)問(wèn)題主要發(fā)生在Solidity編譯器版本 0.4.22. 這個(gè)版本引入了一個(gè)constructor關(guān)鍵字來(lái)表明一個(gè)構(gòu)造函數(shù),而不再要求構(gòu)造函數(shù)名和合約名一致。建議使用constructor關(guān)鍵字來(lái)防止以后高版本帶來(lái)的命名問(wèn)題。
看完上述內(nèi)容,你們掌握使用構(gòu)造函數(shù)導(dǎo)致Dapp漏洞的示例分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!