2009-06-21 7 views
1

Sont-ils moins vulnérables à l'injection SQL que de faire des choses comme mysql_query("SELECT important_data FROM users WHERE password = $password")?Les procédures stockées SQL sont-elles sécurisées?

+0

C'est la manière CLASSIQUE d'être vulnérable à l'injection SQL - concaténant ensemble des choses pour former une instruction SQL et ne validant aucune entrée utilisateur (par exemple pour $ mot de passe). –

+1

Oui, je pense que c'est ce que disait reyjavikvi: est-il plus sûr d'utiliser des procédures stockées dans une base de données qu'une requête SQL construite comme l'exemple montré. – cheduardo

Répondre

5

Ils sont plus sûrs que ce que vous faites. Votre requête affiche du code 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 des anciens SQL simples.

Voici ce que je veux dire. Avec une prococédure stockée, la variable de mot de passe ne peut pas être sql, elle doit être une information recherchée par le système. Dans votre exemple, ce qui est réellement envoyé à la DB est

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

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

ou pire encore:

SELECT * FROM utilisateur Mot de passe OU = (votre mot de passe ici '; DROP Database Nom_base_données - variable $ password).

Une procédure stockée SQL dynamique ne le permettra pas, car le paramètre d'entrée ne s'exécutera pas en tant que SQL supplémentaire.

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

+0

Donc, fondamentalement, l'utilisation d'une procédure stockée rend toutes les valeurs d'entrée non exécutables tandis que l'utilisation de SQL brut permet d'interpréter les données comme du code. Je l'ai. – Green

+0

Pour l'essentiel oui, vous pouvez utiliser sql paramétré et obtenir le même avantage là-bas, et vous pouvez écrire des procédures stockées pour exécuter du code dynamique, de sorte que vous pouvez annuler la sécurité que vous en tirer, mais oui. – kemiller2002

0

Il n'existe aucune technologie sécurisée. Les technologies ne peuvent être utilisées que de manière sûre ou dangereuse. Cela dit, les procédures stockées nécessitent un codage légèrement plus créatif pour permettre l'injection SQL - ce qui arrive quand même. Rien ne vous empêche de concaténer des chaînes dans un moteur de base de données SQL dont je suis au courant.

4

Pas nécessairement, vous pourriez faire la concaténation de cordes à 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îne pour produire du SQL) vous seriez assez bien protégé.

+0

+1 - également, les plans d'exécution des requêtes paramétrées sont mis en cache, de sorte qu'ils sont plus rapides. – karim79

+0

@karim: les plans de procédures stockées sont également mis en cache - les performances ne sont plus un problème entre SP et les requêtes paramétrées. –

0

si elles sont paramétrés correctement et vous n'êtes pas en train de faire sql dynamique alors ils sont plus sûrs et vous bénéficierez également de la réutilisation des plans d'exécution

+0

Dites-moi combien de boutiques informatiques vous connaissez n'ont pas de logique métier dans leur procs ou SQL dynamique. Tous les magasins n'ont pas d'importance s'ils veulent l'admettre ou pas. C'est pourquoi cet argument pour procs stocké ne tiendra jamais. – PositiveGuy

2

Tant que vous utilisez des paramètres et ne pas utiliser la concaténation de chaîne pour user- valeurs saisies, il n'y aura pas de risque d'injection SQL. Les procédures stockées sont un peu plus "sûres" dans cet aspect, car elles vous encouragent à utiliser des paramètres. Mais si, dans la procédure que vous faites quelque chose comme

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

Ensuite, vous serez de retour à la case 1 et très vulnérable aux injections SQL.

De même, 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 ainsi être utilisés pour éviter l'injection SQL.

Questions connexes