# Les 10 Vulnérabilités Solidity les Plus Courantes
La sécurité des smart contracts est primordiale. Voici les 10 vulnérabilités les plus fréquentes en 2026, avec code vulnérable et solutions.
1. Reentrancy
Risque : Appel récursif avant mise à jour de l'état.
// ❌ VULNÉRABLE
function withdraw(uint amount) public {
require(balances[msg.sender] >= amount);
(bool success,) = msg.sender.call{value: amount}("");
balances[msg.sender] -= amount; // Trop tard !
}
// ✅ SÉCURISÉ
function withdraw(uint amount) public {
require(balances[msg.sender] >= amount);
balances[msg.sender] -= amount; // D'abord l'effet
(bool success,) = msg.sender.call{value: amount}("");
require(success);
}
2. Access Control
Risque : Fonctions critiques sans restriction.
// ❌ VULNÉRABLE
function mint(address to, uint amount) public {
balances[to] += amount;
}
// ✅ SÉCURISÉ
address public owner;
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
function mint(address to, uint amount) public onlyOwner {
balances[to] += amount;
}
3. Integer Overflow (pre-0.8.0)
Depuis Solidity 0.8.0, protection automatique. Mais attention aux blocs unchecked !
4. Timestamp Manipulation
Risque : Les mineurs peuvent manipuler block.timestamp (±15 secondes).
// ❌ VULNÉRABLE pour randomness
function random() public view returns (uint) {
return uint(keccak256(abi.encodePacked(block.timestamp)));
}
// ✅ Utiliser un oracle (Chainlink VRF)
5. tx.origin pour Auth
Risque : tx.origin peut être exploité via phishing.
// ❌ VULNÉRABLE
function withdraw() public {
require(tx.origin == owner);
// Phishing possible !
}
// ✅ SÉCURISÉ
function withdraw() public {
require(msg.sender == owner);
}
Conclusion
Utilisez Slither, Foundry fuzz testing et audits professionnels pour détecter ces vulnérabilités.
Pratiquez sur Solingo avec nos 60 challenges de sécurité !