49. Introduction à la Sécurité Web : Prévention des Injections SQL
L'Injection SQL est l'une des vulnérabilités les plus courantes et les plus dangereuses. Elle se produit lorsqu'un attaquant entre du code SQL malveillant dans un formulaire web, qui est ensuite exécuté par la base de données.
La Vulnérabilité (Concaténation)
Imaginez qu'un attaquant entre ceci dans le champ de nom d'utilisateur d'un formulaire de connexion :
' OR 1=1 --
Si nous concaténons ceci directement, le SQL résultant devient :
sql SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = '...'
Le -- transforme le reste de la requête en commentaire, et le OR 1=1 est toujours vrai, accordant un accès non autorisé.
La Solution : Requêtes Préparées (Binding)
Les requêtes préparées garantissent que l'entrée utilisateur est traitée uniquement comme des données, jamais comme du code SQL exécutable. PDO gère cette séparation pour vous.
Non Sûr (À Éviter !) :
php $user_input = $_POST['username']; // DANGEREUX : Concaténer l'entrée directement $sql = "SELECT * FROM users WHERE username = '$user_input'";
Sûr (Utiliser PDO) :
php
prepare($sql); // 2. La fonction bind garantit que user_input est traité comme une valeur de chaîne $stmt->bindParam(':user_input', $user_input); $stmt->execute(); // Si l'attaquant entre ' OR 1=1 --, la base de données recherche un utilisateur // dont le nom d'utilisateur est littéralement égal à la chaîne "' OR 1=1 --", ce qui échoue. ?>Règle Cruciale : Ne faites jamais, au grand jamais, confiance aux entrées utilisateur. Utilisez des requêtes préparées pour chaque requête de base de données qui inclut des données externes.