Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment fonctionne l'injection SQL et comment puis-je m'en protéger

Une injection SQL est une requête SQL formée de manière malveillante utilisée pour "confondre" une base de données SQL en donnant quelque chose qu'elle ne devrait pas. Par exemple, considérez la requête suivante

"SELECT * FROM `users` WHERE `username` = '$name'";

Dans un cas normal, cela fonctionnera. Si nous soumettons 'Jack' à cela, tous les utilisateurs nommés Jack seront renvoyés. Cependant, si un utilisateur saisit, dites "' OR 1=1", la requête résultante sera

"SELECT * FROM `users` WHERE `username` = '' OR 1=1";

Étant donné que 1 est toujours égal à 1 et que la clause combinatoire est OR, cela renverra true sur chaque ligne, qui à son tour affichera CHAQUE ligne à l'utilisateur malveillant. En utilisant cette technique, quelqu'un peut voir l'intégralité de votre base de données. Considérez également si quelqu'un soumet quelque chose comme "'; DROP TABLE users " ;--, ce qui entraîne

"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";

Soit deux requêtes, l'une qui ne fera rien, la seconde qui supprimera TOUTE la base de données des utilisateurs, entraînant la perte de vos données.

La meilleure méthode pour empêcher les injections SQL consiste à utiliser des instructions préparées. Avec ceux-ci, vous envoyez une requête à la base de données SQL qui dit quelque chose comme

"SELECT * FROM `users` WHERE `username` = '?'";

Cela permet à la base de données de connaître le format de la requête (OÙ le nom d'utilisateur est égal à une valeur), il n'y a donc pas de confusion lors d'une requête en texte brut. Ensuite, la base de données sait s'attendre à une valeur et où la mettre. Ensuite, vous transmettez cette valeur à la base de données qu'elle peut utiliser pour rechercher. C'est également mieux car la base de données peut optimiser la requête pour une recherche plus rapide.

Lisez les déclarations préparées, qui vous expliqueront cela plus en détail.