L’injection de code SQL
L'injection de code SQL est une plaie classique et majeure des applications web. Si vous ne connaissez pas le principe, l'explication suivante devrait suffire.
Un trop grand nombre de développeurs réutilisent tel-quels les valeurs récupérées dans les champs de formulaires ou dans les paramètres d'une requête HTTP GET. Et bien trop souvent ces valeurs sont réutilisées pour construire des requêtes SQL vers une base de données relationnelle. L'injection de code SQL consiste alors à passer des valeurs détournées de façon à modifier la requête SQL. Le grand classique est de contourner des vérifications, insérer des données, ou supprimer purement et simplement des tables.
Petit exemple : considérons un formulaire pour se connecter à une application. La requête SQL qui vérifie l'authentification peut alors se construire comme ceci :
select * from USERS where LOGIN = ? and PASSWORD_MD5 = ?
Le grand classique consiste à construire cette chaîne par concaténation :
$sql = "select * from USERS where LOGIN =" + $login + "and PASSWORD_MD5 =" + $password_md5;
Si ce code vous semble familier, réfléchissez à ce qui se passe si un visteur saisi admin'-- pour valeur de $login :
select * from USERS where LOGIN = admin'-- and PASSWORD_MD5 = blablabla
Autrement dit, la requête se retrouver fermée brutalement et le reste de celle-ci est passé en commentaires par '--'. Dans bien des cas, la vérification dans l'application consiste à vérifier si la requête a retourné une réponse, ce qui sera sûrement le cas ici, et le visiteur va alors se retrouver administrateur sans pour autant connaître le mot de passe de admin !
J'ai trouvé cet excellente référence sur l'injection de code SQL. Je vous encourage vivement à la lire.
Sachez enfin qu'en utilisant un framework web solide et agile, vous pouvez vous simplifier grandement la vie. Pour Rails, vous pouvez suivre ce guide sur la sécurité. Ainsi plutôt que de faire un :
Email.find_all "owner_id = 123 AND subject = '#{@params['subject']}'"
préférez cette forme qui protège des injections SQL :
Email.find_all [ "owner_id = 123 AND subject = ?", @params['subject'] ]
Related posts:
- Ce que mon shell révèle …
- GeoPortail
- Donnez votre avis sur la F1
- Le couteau suisse des bases de données
- Excuse pour absence à un TP

