智能合约编程/Dapp漏洞 -- 小心使用构造函数

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

构造函数是一个比较特殊的函数,在构造函数里会执行一些初始化合约是比较关键的功能。在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关键字来防止以后高版本带来的命名问题。

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

你可能感兴趣的:(智能合约编程/Dapp漏洞 -- 小心使用构造函数)