Security
msg.sender ‘spoofing’ 當函式是公共的或外部的
我有一個智能合約,我只希望 onwer 呼叫一個特定的函式,例如:
function getInfo() view public onlyOwner() returns (address) { return msg.sender; } ..... modifier onlyOwner () { require ( msg.sender== my_owner); }
我可以建構一個 web3 呼叫,將其稱為(呼叫)任何地址,在這種情況下是合約的所有者,例如:
web3 = new Web3(App.web3Provider); ...... if(directAccessMode) web3.eth.defaultAccount = '0x1111111111111111111111111111111111111111'; ......
並且能夠在沒有來自 EVM 的任何檢查的情況下獲取所需的資訊,即我確實是我聲稱甚至避免使用地址的訪問詳細資訊的地址的“所有者”。
我知道智能合約數據是公開的,但我不明白為什麼無法控制呼叫者的地址有效性。
謝謝
當您的函式在鏈上執行時,呼叫者無法設置
msg.sender
為他們想要的任何內容。msg.sender
將始終是呼叫您的合約函式的使用者帳戶或合約。它永遠不會是 0x11111111 之類的東西……當您的函式在鏈外執行時(例如
view
,從 web3 呼叫的函式),呼叫者可以設置msg.sender
為他們想要的任何內容。這不是安全風險,因為:
- 執行鏈下的功能不能更改合約狀態、執行鏈上交易或在鏈上做任何其他事情。它永遠不會對其他任何人的函式呼叫產生任何影響。
- 所有儲存在鏈上的數據都是公開可讀的。即使沒有查看函式來讀取它,您仍然可以使用
web3.eth.getStorageAt(...)
.