泰山众筹源码系统开发(全合约)泰山众筹系统开发语言讲解丨泰山众筹商城系统开发技术方案

简介: 泰山众筹源码系统开发(全合约)泰山众筹系统开发语言讲解丨泰山众筹商城系统开发技术方案

重入漏洞相信大家都有所耳闻,那么什么是重入漏洞呢?

众所周知,以太坊的转账不仅可以在钱包地址之间进行,合约与钱包地址之间、合约与合约之间也可以,而合约在接收到转账的时候会触发 fallback 函数执行相应的逻辑,这是一种隐藏的外部调用。攻击者就会利用这一点,在合约的fallback 函数中写入恶意逻辑重新进入到被攻击的合约内部,让被攻击的合约执行非预期的外部调用,从而到达获取不正当利益的目的。

漏洞示例

下面我们来看一个比较典型的有重入漏洞的代码:

漏洞分析

上面的代码就是个普通的充提币的合约,那么怎么对其发起重入攻击呢?我们来看这个合约的 withdraw 函数,这个函数中的转账操作有一个外部调用“msg.sender.call{value: bal}”,所以我们就可以认为这个合约是可能有重入漏洞的,让我们来进一步分析看看:

在 withdraw 函数中是先执行外部调用进行转账后才将账户余额清零的,那么就可以在转账外部调用的时候构造一个恶意的逻辑合约在合约执行 balance[msg.sender]=0之前一直循环调用 withdraw 函数一直提币从而将合约账户清空。

攻击合约

下面我们看看攻击者编写的攻击合约中的攻击手法是否与我们的漏洞分析相同:

我们看到 EtherStore 合约是一个充提合约,我们可以在其中充值和提现。

攻击者先调用合约中的攻击函数先向EtherStore中充值1ether,在EtherStore中他的账户余额就为1ether,那么他就可以提现这些余额。紧接着,withdraw 函数发起提现,当EtherStore向攻击合约转账完成时,攻击合约就会调用fallback函数,再次请求提现余额,如此循环就能将EtherStore中的余额提现到不足1ether,才结束这个循环。

攻击函数调用流程图:

修复建议

看了上面的攻击手法相信大家对重入漏洞都会有一个自己的认知了,但是我们的应该怎么避免重入漏洞防御重入攻击呢?以下是我给大家的建议:

  1. 写代码时需要遵循先判断,后写入变量在进行外部调用的编码规范(Checks-Effects-Interactions)。
  2. 加入防重入锁。

下面是一个防重入锁的代码示例:

相关文章
泰山众筹商城系统模式开发解读
模式说明: 众筹是100U 众筹第一期价格为商品首次上架的价格。 比如:商品A每天17:00-19:00开放众筹。用户每期参与最低最高参与众筹:1-10U。 第二期众筹价格(商品价格),增加30%,以此类推,每个商品每轮增加XX%
泰山众筹系统开发|解析泰山众筹模式火爆原因
最近也有不少读者私信问我这个模式,今天就在这里分析一下,泰山众筹模式的优势也就是它在市场爆火的原因。
|
新零售 大数据 云计算
泰山众筹商城系统开发案例详细/方案程序/成熟技术/开发项目/源码平台
  新零售指的就是线上、线下和物流必须结合在一起。也就是说,线下的企业必须走到线上去,线上的企业必须走到线下来,线上、线下同现代物流结合在一起,才能真正创造出新的销售方式。
|
存储 区块链
去中心化泰山众筹互助商城dapp系统开发源代码
去中心化区块链泰山众筹互助商城dapp系统开发源代码
|
新零售 存储 缓存
区块链阿凡达泰山众筹商城系统开发(正式版)丨区块链阿凡达泰山众筹商城开发源码系统
“新零售”的核心要义在于推动线上与线下的一体化进程,其关键在于使线上的互联网力量和线下的实体店终端形成真正意义上的合力,从而完成电商平台和实体零售店面在商业维度上的优化升级。同时,促成价格消费时代向价值消费时代的全面转型。
|
新零售 人工智能 缓存
泰山众筹(阿凡达4.0)系统开发详细及方案丨泰山众筹(阿凡达4.0)开发源码及平台
新零售是指个人、企业以互联网为依托,通过运用大数据、人工智能等先进技术手段并运用心理学知识,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。
|
缓存
阿凡达泰山众筹商城开发详情丨阿凡达泰山众筹商城系统开发(开发模板)丨阿凡达泰山众筹商城源码及功能系统
 如果当前word中没有记录其他tick index,那么取这个word的最小/最大tick index,这么做的目的是,让单步交易中tick的跨度不至于太大,以减少计算中溢出的可能性
|
数据格式 JSON
泰山众筹4.0开发案例源码丨泰山众筹4.0系统开发(详细规则及功能)丨泰山众筹4.0系统源码模式
contract ERC721 { function balanceOf(address _owner) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
|
存储 安全 区块链
区块链众筹项目系统开发技术丨泰山众筹商城系统开发技术讲解方案
区块链众筹项目系统开发技术丨泰山众筹商城系统开发技术讲解方案
208 0