这篇文章主要为大家分析了visibility指定符不当使用导致Dapp漏洞的示例分析的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“visibility指定符不当使用导致Dapp漏洞的示例分析”的知识吧。
Solidity函数有visibility指定符,标明函数如何被允许访问。Visibility决定一个函数是否能被用户,被其他派生合约,从外部调用,仅从内部调用等等。有4个visibility指定符.函数默认的visibility指定符是public – 允许用户外部调用。visibility 指定符的不正当使用可能导致灾难性的漏洞。
函数默认的visibility指定符是public。没有指定函数visibility指定符的话,那就被认定是public,意味着该函数就会允许外部用户调用。当开发程序员对本应该是private(只能从合约内部访问调用)的函数错误的没有指定visibility指定符,就会引入漏洞。请看下面的例子:
contract HashForEther { function withdrawWinnings() { // Winner if the last 8 hex characters of the address are 0. require(uint32(msg.sender) == 0); _sendWinnings(); } function _sendWinnings() { msg.sender.transfer(this.balance); } }
这个简单的合约是一个猜地址获取奖励的游戏。用户必须生成一个以太坊地址,如果它的16进制的后8位都是0,就可以赢得游戏。一旦赢得游戏,他们就可以通过调用WithdrawWinnings()函数来获得奖励。但是,很不幸,函数的visibility并没有被指定,特别是_sendWinnings() 函数是public 并且任何地址都可以调用这个函数来偷取奖励。
在智能合约编程的时候,最好给所有函数来指定函数的visibility,即使他们是intentionally public. 最近的Solidity版本加入了对未显式指定visibility指定符的编译警告。
关于“visibility指定符不当使用导致Dapp漏洞的示例分析”就介绍到这了,更多相关内容可以搜索亿速云以前的文章,希望能够帮助大家答疑解惑,请多多支持亿速云网站!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。