我正在构建一个ERC20 smart contract,它将通过node.js和web3库进行访问。我看到web3.eth.Contract有send函数,它接受参数from,该参数在智能契约中映射到msg.sender。就我所理解的(以及我的调试支持)而言,我可以将from字段更改为几乎任何地址,这样就可以绕过契约的业务逻辑,例如
token.methods.method_only_owner_can_activate(<some_data>).send({ from: <contract_owner_address>, <gas> });甚至把主人:
token.methods.setOwner(<my_not_owner_address>).send({ from: <contract_owner_address>, <gas> });因为地址应该是公开的,所以任何用户都可以创建一个进程来模仿这个行为,并绕过我的安全逻辑。
还有其他方法确实与private key签署了事务,但是send方法是开放的,可以绕过业务逻辑,这似乎是一个很大的安全问题。
因为我错过了什么?
发布于 2018-09-02 17:24:48
任何事务到实际的Ethereum区块链都需要用私钥签名。
要使上面的代码工作(只是提供一个from地址),连接到的节点必须为您进行签名。只要from地址在该节点中是“未锁定的”(测试网络(如ganache )下的默认地址,或者使用普通节点(如geth或奇偶校验)显式完成的默认地址),它就能够使用该密钥对事务进行签名并发送。
在现实世界中,你的应用程序的用户不会连接到一个拥有私钥的节点,所以这不是一个问题。
发布于 2018-09-02 17:32:36
web3库创建需要由from中指定的帐户签名的事务。它是通过与拥有该帐户私钥的本地节点(该节点拥有该帐户的私钥并目前已将其解锁)进行签名的,或者由一款软件(如Metamask )进行签名,该软件控制该私钥,并仅在用户确认时签署交易。
没有from字段中帐户的私钥,就不可能发送有效(签名)事务。
发布于 2018-09-02 17:24:27
msg.sender属性不能伪造--至少有人不能用msg.sender创建一个事务,而该事务不是他们拥有的地址。
无论您在合同中有什么安全措施,您都可以依赖于这样一个事实,即msg.sender地址是进行事务的人。
https://ethereum.stackexchange.com/questions/57934
复制相似问题