Injection SQL : Comment ça fonctionne et comment l'arrêter
L'injection SQL reste une des vulnérabilités les plus exploitées. Voyez comment une attaque extrait des données et apprenez les défenses efficaces qui l'arrêtent.
Table des matières
Qu'est-ce que l'injection SQL ?
L'injection SQL (SQLi) se produit quand une application intègre des données utilisateur directement dans une requête SQL sans les assainir correctement. Un attaquant peut insérer des commandes SQL malveillantes pour lire, modifier ou supprimer des données de la base de données.
Exemple d'attaque
Code vulnérable :
query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"
Ce qu'un attaquant entre comme nom d'utilisateur :
admin' --
La requête résultante :
SELECT * FROM users WHERE username = 'admin' --' AND password = '...'
Le -- commente le reste de la requête. L'attaquant se connecte comme admin sans connaître le mot de passe.
Types d'injection SQL
- In-band SQLi — résultats retournés directement dans la réponse
- Blind SQLi — pas de résultats visibles, l'attaquant déduit les informations via des questions vrai/faux
- Out-of-band SQLi — données extraites via un canal différent (requêtes DNS)
Comment prévenir l'injection SQL
Requêtes paramétrées (la solution principale) :
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
Autres mesures :
- ORM (SQLAlchemy, Hibernate) — utilisent automatiquement des requêtes paramétrées
- Validation des entrées — rejetez les entrées inattendues
- Principe du moindre privilège — l'utilisateur DB n'a que les permissions nécessaires