使用构造函数导致Dapp漏洞的示例分析

使用构造函数导致Dapp漏洞的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

我们提供的服务有:网站建设、成都网站设计、微信公众号开发、网站优化、网站认证、巩义ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的巩义网站制作公司

构造函数是一个比较特殊的函数,在构造函数里会执行一些初始化合约是比较关键的功能。在Solidity 版本0.4.22之前,构造函数是一个和合约同名的函数。所以如果在开发过程中,合约名变了的话,如果构造函数名没有发生变化,原来的构造函数就会变成常规的可以调用的函数。这就会导致合约漏洞。

攻击原理

合约名变了的话,或者构造函数有一个输入错误,这会导致函数名和合约名不一致。这个时候,构造函数就是一个常规的函数。如果构造函数里执行了一些已授权的专有操作,就会导致严重的后果。看看下面的合约代码:

 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);
  }
 }

这个合约接受ether充值,并且仅允许合约所有者可以用withdraw()函数提取。如果构造函数变成了常规函数的话,任何用户都可以调用ownerWallet函数,把他们自己设置成为合约的所有者,然后调用withdraw提取合约里所有的资金。

防护技术

这个问题主要发生在Solidity编译器版本 0.4.22. 这个版本引入了一个constructor关键字来表明一个构造函数,而不再要求构造函数名和合约名一致。建议使用constructor关键字来防止以后高版本带来的命名问题。

看完上述内容,你们掌握使用构造函数导致Dapp漏洞的示例分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


分享标题:使用构造函数导致Dapp漏洞的示例分析
分享路径:http://scyanting.com/article/gppsjj.html