Solidity view函数通过web3修改call参数from绕过msg.sender校验如何修复?
这是正常现象,不存在安全风险
你观察到的是call()方法的固有特性,不需要担心所谓的“绕过校验”带来的实际安全问题:
call()是本地节点执行的只读模拟调用,不会将交易广播上链,节点只会按照你传入的from参数设置模拟执行环境里的msg.sender,不会校验你是否持有对应地址的私钥。- 这类模拟调用仅能拿到
view/pure函数的返回值,无法修改链上任何状态。真正需要修改链上状态的签名交易(send类交易),必须用对应地址的私钥签名才能广播,就算攻击者修改了代码里的from变量,没有私钥也无法完成交易,链上的require校验会正常生效。
修复方案
你不需要针对这个特性做额外修复,只要遵循两个开发原则即可:
- 不要在链上存储任何需要保密的敏感信息:以太坊所有链上数据都是公开可查的,哪怕你给
view函数加了msg.sender校验,攻击者也可以直接通过读取合约存储插槽拿到对应数据,不需要调用你的函数。 - 所有涉及权限校验的状态修改操作,不要声明为
view/pure,走正常的签名交易流程即可,原生的交易签名机制已经能保证msg.sender无法伪造。
内容的提问来源于stack exchange,提问作者Daniel Rayos
相关产品推荐
相关产品推荐

