mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #3197 from medvedev1088/fix-security-considerations-example
Add another example with call to demonstrate Re-Entrancy
This commit is contained in:
commit
40e8716926
@ -69,10 +69,27 @@ complete contract):
|
||||
}
|
||||
|
||||
The problem is not too serious here because of the limited gas as part
|
||||
of ``send``, but it still exposes a weakness: Ether transfer always
|
||||
includes code execution, so the recipient could be a contract that calls
|
||||
of ``send``, but it still exposes a weakness: Ether transfer can always
|
||||
include code execution, so the recipient could be a contract that calls
|
||||
back into ``withdraw``. This would let it get multiple refunds and
|
||||
basically retrieve all the Ether in the contract.
|
||||
basically retrieve all the Ether in the contract. In particular, the
|
||||
following contract will allow an attacker to refund multiple times
|
||||
as it uses ``call`` which forwards all remaining gas by default:
|
||||
|
||||
::
|
||||
|
||||
pragma solidity ^0.4.0;
|
||||
|
||||
// THIS CONTRACT CONTAINS A BUG - DO NOT USE
|
||||
contract Fund {
|
||||
/// Mapping of ether shares of the contract.
|
||||
mapping(address => uint) shares;
|
||||
/// Withdraw your share.
|
||||
function withdraw() {
|
||||
if (msg.sender.call.value(shares[msg.sender])())
|
||||
shares[msg.sender] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
To avoid re-entrancy, you can use the Checks-Effects-Interactions pattern as
|
||||
outlined further below:
|
||||
|
Loading…
Reference in New Issue
Block a user