智能合约编程/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指定符的编译警告。

转载于:https://my.oschina.net/gavinzheng731/blog/3005368

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值