Security

msg.sender ‘spoofing’ 當函式是公共的或外部的

  • February 11, 2022

我有一個智能合約,我只希望 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為他們想要的任何內容。這不是安全風險,因為:

  1. 執行鏈下的功能不能更改合約狀態、執行鏈上交易或在鏈上做任何其他事情。它永遠不會對其他任何人的函式呼叫產生任何影響。
  2. 所有儲存在鏈上的數據都是公開可讀的。即使沒有查看函式來讀取它,您仍然可以使用web3.eth.getStorageAt(...).

引用自:https://ethereum.stackexchange.com/questions/68921