博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
智能合约编程/Dapp漏洞 -- 小心使用构造函数
阅读量:7007 次
发布时间:2019-06-27

本文共 835 字,大约阅读时间需要 2 分钟。

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

你可能感兴趣的文章
奔泪,同IP垃圾站过多是怎么被K的
查看>>
TCP/IP Troubleshooting
查看>>
js 中使用外部导入的对象
查看>>
windbg 内核调试的时候 对用户态进程下断点
查看>>
分布式系统的事务处理
查看>>
Nginx URL重写规则配置详解
查看>>
NAND闪存供过于求的情况今年会有所好转吗?
查看>>
记录一次测试上线遇到的问题
查看>>
简单实现了一个基于redis的分布式锁,存在bug...
查看>>
HashMap中的一些变量的意义
查看>>
解决MyBatis的Mapper XML错误,系统起不来,也不报错问题
查看>>
JBPM3 获得待办列表 1:未接收;2:办理中;3:已办结;4:全部工作
查看>>
zhparser在windows下的编译安装
查看>>
微信开发之网页获取用户信息
查看>>
自定义xml tag
查看>>
Linux下的find命令
查看>>
shiro favicon.ico 404
查看>>
VMware启动Ubuntu时出现错误Cannot open the disk 'xxx.vm...
查看>>
解决 HTML div css 强制 换行 不换行
查看>>
android 相关知识
查看>>