Question

Sont-ils moins vulnérables à l'injection SQL que de faire des opérations telles que mysql_query ("SELECT compte_important DES utilisateurs WHERE motdepasse = $ motdepasse") ?

Était-ce utile?

La solution

Ils sont plus en sécurité que ce que vous faites. Votre requête publie du SQL brut sur la base de données, ce qui signifie que vos paramètres ne sont pas traités comme des paramètres SQL, mais comme du vieux SQL pur.

Voici ce que je veux dire.

Avec une procédure stockée, la variable mot de passe ne peut pas être SQL, il doit s'agir d'une information recherchée par le système. Dans votre exemple, ce qui est réellement envoyé à la base de données est

SELECT * FROM Utilisateur où password = ('votre mot de passe ici' - variable $ Password) ..... afin que quelqu'un puisse faire quelque chose comme

SELECT * FROM utilisateur WHERE Password = ('votre mot de passe ici'; SELECT * FROM utilisateur - variable mot de passe).

ou pire encore:

SELECT * FROM utilisateur WHERE Password = ('votre mot de passe ici'; DROP Database Database_Name - variable $ password).

Une procédure stockée SQL non dynamique n'autorisera pas cela, car le paramètre d'entrée ne sera pas exécuté en tant que SQL supplémentaire.

Le SQL paramétré s’occupe de cela, mais techniquement, les procédures stockées sont encore un peu plus sécurisées, car l’utilisateur accédant aux informations de la table n’a pas besoin d’un accès en lecture. Il suffit de pouvoir exécuter la procédure stockée. Selon vos besoins, cela peut ou non entrer en jeu.

Autres conseils

Pas nécessairement, vous pourriez faire une concaténation de chaînes à l'intérieur et l'exposition serait la même. Si vous utilisez SQL dynamique avec des variables de paramètre (pas de concaténation de chaînes pour produire du code SQL), vous serez assez bien protégé.

Tant que vous utilisez des paramètres et que vous n'utilisez pas la concaténation de chaînes pour les valeurs entrées par l'utilisateur, il n'y aura aucun risque d'injection SQL. Les procédures stockées sont un peu "plus sûres". dans cet aspect, car ils vous incitent à utiliser des paramètres. Mais si dans la procédure vous faites quelque chose comme

EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password

Vous serez alors de retour à la case 1 et très vulnérables aux injections SQL.

En outre, il existe des "instructions préparées". qui ne sont pas des procédures stockées, mais peuvent également utiliser des paramètres. Ils peuvent donc également être utilisés pour éviter les injections SQL.

Il n’existe pas de technologies sécurisées. Les technologies ne peuvent être utilisées que de manière sûre ou non.

Cela dit, les procédures stockées nécessitent un codage légèrement plus créatif pour permettre l’injection SQL - ce qui se produit néanmoins. Rien ne vous empêche de concaténer des chaînes dans celles-ci, dans tout moteur de base de données SQL dont je suis au courant.

s’ils sont correctement paramétrés et que vous ne faites pas du SQL dynamique, ils sont plus sécurisés et vous bénéficierez également d’une réutilisation du plan d’exécution

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top