合约常见漏洞和代码风险
程序员文章站
2022-03-01 20:17:27
...
常见漏洞
1.在做运算时有可能导致uint256溢出,验证的时候可以通过,实际会导致账户增加大量token,所以最好在运算时使用safemath库
2.重入攻击,利用转账会触发fallback,再次"提现",而提现函数中先触发转账,没有及时更新数据库导致被重入,一般使用标致位或先修改数据库
3.访问权限控制,要注意各修饰符中的逻辑正确性,避免bug导致权限校验失败
4.尽量避免跨合约调用,有一些经常被调用的函数要设置成合约不可调用,如限制msg.sender和tx.origin为同一个地址
5.在使用随机数的时候尽量避免随机数的直接获利,如果一定要使用随机数"开大奖",则最好使用chainlink的vrf随机数,在区块链上真随机和速度无法兼顾
7.短地址攻击,在转账的时候先生成一个00结尾的地址,然后在调用转账的时候,地址不传结尾的00,导致自动补0,而金额也会向前移2位,导致多转了256*n个token
代码风险
1.关键代码前有超长空格
2.父类和子类有同名变量,这个变量在子类用的其实是自己的,而修饰符的权限校验很有可能用的是父类的变量
3.编译器版本不能太低,0.4是有明显的bug,未初始化的结构体局部变量赋值时,会直接覆盖智能合约定义的前几个变量
4.var默认用是的uint8,在for循环时很有可能溢出,造成某些判定成功
1.在做运算时有可能导致uint256溢出,验证的时候可以通过,实际会导致账户增加大量token,所以最好在运算时使用safemath库
2.重入攻击,利用转账会触发fallback,再次"提现",而提现函数中先触发转账,没有及时更新数据库导致被重入,一般使用标致位或先修改数据库
3.访问权限控制,要注意各修饰符中的逻辑正确性,避免bug导致权限校验失败
4.尽量避免跨合约调用,有一些经常被调用的函数要设置成合约不可调用,如限制msg.sender和tx.origin为同一个地址
5.在使用随机数的时候尽量避免随机数的直接获利,如果一定要使用随机数"开大奖",则最好使用chainlink的vrf随机数,在区块链上真随机和速度无法兼顾
7.短地址攻击,在转账的时候先生成一个00结尾的地址,然后在调用转账的时候,地址不传结尾的00,导致自动补0,而金额也会向前移2位,导致多转了256*n个token
代码风险
1.关键代码前有超长空格
2.父类和子类有同名变量,这个变量在子类用的其实是自己的,而修饰符的权限校验很有可能用的是父类的变量
3.编译器版本不能太低,0.4是有明显的bug,未初始化的结构体局部变量赋值时,会直接覆盖智能合约定义的前几个变量
4.var默认用是的uint8,在for循环时很有可能溢出,造成某些判定成功
下一篇: ruby