首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tx.origin替代

tx.origin替代
EN

Ethereum用户
提问于 2019-10-23 23:02:01
回答 1查看 562关注 0票数 5

我找不到合适的、简单的tx.origin漏洞修复方法,如果不使用任何修饰符,任何帮助都是非常感谢的,

谢谢,

PS: msg.sender不是我要找的(如果另一个合同调用您的合同,msg.sender将是合同的地址,而不是调用合同的用户的地址)

代码语言:javascript
运行
复制
contract Proxy {

    address myAddress;

    function callMyContract() public view returns(address) {
        MyContract(myAddress).doSomthing();
    }
}

contract MyContract {

    event Something(address sender);

    function doSomthing() public (address) {
        emit Something(msg.sender); // Proxy address
        emit Something(tx.origin); // User address (the one I need) but vulnerable
    }
}
EN

回答 1

Ethereum用户

回答已采纳

发布于 2019-10-24 00:13:38

tx.origin的漏洞来自于其语义本身,因此没有其他直接的选择。通常的建议是以不需要tx.origin的方式设计您的合同。

出发地:https://github.com/ethereum/solidity/issues/683

  1. tx.origin是一个安全漏洞。正如我们最近在Mist钱包中看到的那样,使用tx.origin使您容易受到类似于钓鱼或跨站点脚本的攻击。一旦用户与恶意契约交互,该契约就可以将用户模拟为依赖tx.origin的任何合同。
  2. tx.origin破坏了兼容性。使用tx.origin意味着您的合同不能被另一个合同使用,因为合同永远不可能是tx.origin。这破坏了Ethereum契约的一般可组合性,使它们变得不那么有用。此外,这也是另一个安全漏洞,因为它使基于安全性的契约(如multisig钱包)与您的合同不兼容。
  3. tx.origin几乎没有用处。这是最主观的观点,但我还没有发现tx.origin的使用对我来说是合法的。我欢迎反例,但我已经写了几十或数百个智能合同而不需要它,我也从未听说过其他人需要它。

如果需要tx.origin检查呼叫是否来自智能契约,则可以使用喜欢

代码语言:javascript
运行
复制
function isContract(address _addr) private returns (bool isContract){
  uint32 size;
  assembly {
    size := extcodesize(_addr)
  }
  return (size > 0);
}

其他资源

票数 7
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/76929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档