Injections SQL

Une injection SQL (SQL injection ou SQLi) est une faille de sécurité qui permet à un attaquant d’exécuter du code SQL malveillant sur une base de données, en trompant une application web qui n’a pas correctement filtré les entrées utilisateur.

En résumé : l’attaquant « parle directement à la base de données » à travers un formulaire, une URL ou un champ de recherche et peut lire, modifier, supprimer ou contourner des données sensibles.

C’est l’une des vulnérabilités web les plus anciennes et les plus dangereuses (classée #1 dans les OWASP Top 10 pendant des années).

Comment ça marche ? (exemple simple)

Imaginons un site de login avec cette requête SQL mal sécurisée :

SELECT * FROM users WHERE email = '[EMAIL]' AND password = '[MOT_DE_PASSE]';

Si le développeur insère directement ce que l’utilisateur tape dans le champ email, un attaquant peut saisir :

' OR '1'='1

La requête devient alors :

SELECT * FROM users WHERE email = '' OR '1'='1' AND password = '[n’importe quoi]';

Comme '1'='1' est toujours vrai, la condition est remplie… et l’attaquant se connecte sans mot de passe.

Pire : avec des payloads comme '; DROP TABLE users; --, il peut effacer toute la base.

Conséquences possibles

  • Vol de données : emails, mots de passe (même hachés), informations personnelles
  • Modification ou suppression de contenus (ex. : articles WordPress)
  • Contournement d’authentification (accès admin)
  • Exécution de commandes système (si la BDD a des privilèges étendus)
  • Atteinte à la conformité RGPD → sanctions, perte de confiance

Comment se protéger ? (bonnes pratiques)

PratiqueExplication
Requêtes préparées (prepared statements)Utiliser des paramètres typés au lieu de concaténer des chaînes → le moteur SQL distingue code et données. <br> Ex. en PHP (PDO) : $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
Échappement strictSi les requêtes préparées ne sont pas possibles, échapper toujours les entrées avec des fonctions dédiées (mysqli_real_escape_string, etc.).
Principe du moindre privilègeLe compte BDD utilisé par l’appli web ne doit pas avoir les droits DROP, CREATE, ou FILE.
Validation des entréesRefuser les caractères suspects (apostrophes, points-virgules) dans les champs où ils ne sont pas nécessaires.
Mise à jour régulièreBeaucoup d’injections passent par des plugins ou CMS obsolètes (ex. : anciennes versions de WordPress + plugins vulnérables).
Les contenus de définition restent publics. Les ressources (outils, grilles, supports) liées à cette fiche sont disponibles dans l’espace membre.