区块链研究实验室|Ethernaut Level 4 Telephone 如何防止滥用tx.origin和msg.sender

  • 时间:
  • 浏览:68
  • 来源:区块链技术网

此级别要求您了解tx.origin与msg.sender之间的细微差别以声明智能合约的所有权。

tx.origin:

  1. 发起交易的原始用户钱包。

  2. 可能是整个交易和调用链的起始地址。

  3. 只有用户钱包地址可以是tx.origin。

  4. 合同地址永远不会是tx.origin。

msg.sender:

  1. 特定交易或调用的发送者

  2. 用户钱包和智能合约都可以是msg.sender

示例场景:

提示:msg.sender检查外部函数调用的直接来源。msg.sender通常是您要进行身份验证的人。

示例演练

1、注意Telephone.sol的changeOwner函数检查是否(tx.origin!= msg.sender)。似乎我们可以通过方案3成功触发此功能:

2、创建一个电话合同,Telephony构成合同A.在Telephony中实例化合同B,您的Telephone.sol:

contract Telephony {
    Telephone public phone = Telephone(YOUR_INSTANCE_ADDR_HERE);
    //TODO...
}

3、在Telephony中创建一个changeOwner函数,该函数调用Telephone中的changeOwner函数,即玩电话游戏。

function changeOwner(address _ownerpublic {
    phone.changeOwner(_owner);
}

4、注意await contract.owner()在控制台中现在指示您的用户钱包是所有者!

关键安全要点:

 

  1. 切勿使用tx.origin作为授权检查谁在调用您的合同。

  2. 如果需要授权直接发送者,请使用msg.sender。

 

描下放二维码添加我,拉您进入技术交流群

猜你喜欢