Définition
L'injection SQL est une vulnérabilité de sécurité qui permet à un attaquant d'insérer du code SQL malveillant dans les requêtes d'une application, via les champs de saisie ou les paramètres d'URL. C'est l'une des vulnérabilités les plus dangereuses et les plus courantes (OWASP Top 10 #3).
Une injection SQL reussie peut permettre de lire, modifier ou supprimer toutes les données de la base, voire prendre le contrôle du serveur.
Comment ca marche ?
Application vulnérable
# DANGEREUX : concatenation de strings
query = f"SELECT * FROM users WHERE email = '{user_input}' AND password = '{password}'"
Attaque
Si l'utilisateur entre comme email : ' OR '1'='1' --
La requête devient :
SELECT * FROM users WHERE email = '' OR '1'='1' --' AND password = ''
-- Le -- commente le reste → retourne TOUS les utilisateurs !
Autres exemples d'injection
-- Supprimer une table
'; DROP TABLE users; --
-- Lire d'autres tables (UNION-based)
' UNION SELECT username, password FROM admin_users --
-- Extraire des informations systeme
' UNION SELECT version(), current_database() --
Prévention : les requêtes paramétrées
La seule protection fiable est d'utiliser des requêtes paramétrées (prepared statements) :
# Python (psycopg2)
cursor.execute("SELECT * FROM users WHERE email = %s AND password = %s", (email, password))
// Node.js (postgres)
const result = await sql\`SELECT * FROM users WHERE email = ${email}\`;
// Java (PreparedStatement)
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE email = ?");
stmt.setString(1, email);
// PHP (PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(['email' => $email]);
Autres protections
- ORM : les ORM modernes (Drizzle, Prisma, Eloquent) utilisent des requêtes paramétrées par défaut
- Validation des entrées : vérifier le type et le format (mais ne remplace PAS les requêtes paramétrées)
- Moindre privilege : le compte SQL de l'app ne doit pas avoir les droits DROP, GRANT, etc.
- WAF : les Web Application Firewalls (Cloudflare, AWS WAF) detectent les patterns d'injection
Outils de détection
- sqlmap : outil open source de détection automatique d'injections SQL
- OWASP ZAP : scanner de vulnérabilités web
- Burp Suite : suite de test de sécurité web