Problème : Construction dynamique des requêtes SQL
Lorsque les requêtes SQL sont construites dynamiquement, elles sont générées en concaténant
directement des données utilisateur avec des instructions SQL. Cette méthode est vulnérable à
des attaques comme l'injection SQL. Par exemple :
Si un attaquant saisit un input malveillant, comme admin' --, la requête deviendra :
SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'password123';
Le -- transforme tout ce qui suit en commentaire SQL. Résultat : l'attaquant accède à
l'utilisateur admin sans fournir le mot de passe.
Solution : Requêtes paramétrées
Les requêtes paramétrées (aussi appelées requêtes préparées) sont une méthode sûre pour
exécuter des instructions SQL. Elles séparent clairement les instructions SQL et les données
utilisateur, empêchant les données de l'utilisateur d'être interprétées comme des commandes
SQL.
Voici comment cela fonctionne :
1. Structure prédéfinie de la requête SQL : La requête est définie avec des
paramètres placeholders (ex. : ? ou :param_name).
2. Paramètres passés séparément : Les données utilisateur sont envoyées
indépendamment, sous forme de paramètres, et non concaténées dans la requête.
3. Validation et échappement automatique : Le moteur SQL traite les données
utilisateur comme des valeurs littérales et échappe automatiquement tout caractère
spécial (comme ', --).
Placeholders (?) : Utilisés pour insérer des paramètres.
Les données utilisateur (variables user_input_username et user_input_password) sont
transmises séparément.
Si un attaquant tente une injection SQL ("admin' --"), cela sera traité comme une chaîne
de caractères normale et non comme du code SQL.