博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
智能合约编程/Dapp漏洞 -- 默认可见性修饰符
阅读量:6906 次
发布时间:2019-06-27

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

hot3.png

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

你可能感兴趣的文章
通用服务器桩-Receiver使用说明文档
查看>>
使用asp.net 2.0的CreateUserwizard控件如何向自己的数据表中添加数据
查看>>
一次WinRoute后门攻防实况
查看>>
Intel主板支持硬盘热拔插显示图标的原因
查看>>
RHEL6基础三十六之服务器维护基础命令⑥sed
查看>>
浅谈AD RID池系列(三):Server 2008 R2补丁for RID
查看>>
针对桌面云终端做专用的高性价比CPU,吉湾微电子获首轮融资
查看>>
poj2481 树状数组
查看>>
Contrinex为高温应用推出新的RFID标签
查看>>
Q3中国光网络系统支出放缓
查看>>
MapXtreme 2005 学习心得 第八节Session问题澄清-两种配置方式致开发方式不同(九)...
查看>>
Windows 10即将针对共享功能进行大量修复和改进
查看>>
数据驱动业务决策的5个步骤
查看>>
上网个人信息如何不“裸奔” 10条信息安全建议
查看>>
JIRA的常用选项
查看>>
专访Facebook HipHop作者、阿里研究员赵海平:生物与计算机交织的独特人生
查看>>
监控视频须严加规范
查看>>
实例化需求的优点
查看>>
通过vmstat的简单分析数据库操作
查看>>
OpenStack详细解读:定义,好处与使用实例
查看>>