Formation PUB010 : PHP, 2025 Écrire du code PHP sécurisé

31.2 Exemple d'injection SQL


Les injections SQL sont un réel risque dans toute application qui effectue des requêtes à une base de données.

Les utilisateurs malveillants tenteront d'entrer des caractères spécifiques pour que, lorsque ces informations seront utilisées dans une requête SQL, la requête SQL soit transformée à leur avantage.

Dans cette fiche :

Cas classique

Voici un exemple classique du risque encouru lorsqu'une requête utilise une variable dont la valeur peut avoir été entrée par un usager.

Cette requête SQL permet vérifier si l'usager a fourni les bonnes informations d'authentification :

PHP

$requete = "SELECT nomfamille, prenom FROM usagers WHERE code = '$code' AND motdepasse = '$motdepassecrypte'"; 

Dans un formulaire d'authentification, un usager pourrait entrer comme code d'authentification « 1' OR 1=1 --  ». Ceci peut sembler bizarre mais chacun de ces caractères joue un rôle bien particulier. La requête lancée sur le serveur sera la suivante :

MySQL

SELECT nomfamille, prenom FROM usagers WHERE code = '1' OR 1=1 -- ' AND motdepasse = '...'; 

L'usager malveillant pourrait donc s'authentifier sur le système sans connaître le mot de passe puisque la condition 1=1 serait toujours évaluée à VRAI et que les caractères -- indiquent que le reste de la requête est un commentaire.

Vous pouvez tester cette technique sur un site de défis de sécurité : https://ringzer0team.com/login

La meilleure technique pour se prémunir contre une telle attaque est d'utiliser une requête préparée dès que la requête contient une variable.

La requête préparée va s'assurer qu'aucun caractère ne puisse modifier la nature de la requête SQL.

L'apostrophe ne sera donc pas interprétée comme caractère de fin de chaîne et les caractères -- ne seontpas interprétés comme une marque de commentaire alors l'authentification ne pourra pas avoir lieu sans les vraies informations d'un usager.

Blague sur les injections SQL

Source : http://xkcd.com/327/

Cas vécu

Un vendeur automobile de la région, La Clé d'Or Autos, voulait effectuer des transactions sur une nouvelle plateforme gouvernementale.

Rien à faire, le propriétaire ne réussissait pas à travailler avec cette plateforme. Il n'arrivait jamais à s'authentifier.

Après des mois de discussions avec les responsables de la plateforme, il a fini par se faire dire : « Monsieur, nous avons trouvé la cause de tous vos soucis. C'est à cause du nom de votre commerce. En informatique, un apostrophe suivi de OR a une signification particulière et c'est ce qui fait que rien ne fonctionne pour vous ».

Sans commentaire :-(

Pour plus d'information

« Injection SQL ». PHP. http://php.net/manual/fr/security.database.sql-injection.php

« Sécurité ». PHP. http://www.php.net/manual/fr/security.php

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre