95 votes

Une déclaration paramétrée peut-elle empêcher toute injection SQL ?

Si oui, pourquoi y a-t-il toujours autant d'injections SQL réussies ? Juste parce que certains développeurs sont trop bêtes pour utiliser des instructions paramétrées ?

6 votes

C'est une grande question, avec des réponses absolument terribles (comme à l'heure où je commente).

0 votes

Je souhaite que quelqu'un ayant une bonne réputation de 15 000 au moins ou ayant une bonne expérience puisse apporter une contribution précieuse à cette question.

4 votes

Ver Bill Karwin Mythes et fausses idées sur l'injection SQL parler y diapositives pour plus d'informations sur ce sujet. Il explique ce qu'est une injection SQL, comment l'échappement n'est généralement pas suffisant et comment les procédures stockées et les instructions paramétrées peuvent être compromises.

74voto

Mike Points 11170

Les liens que j'ai postés dans mes commentaires à la question expliquent très bien le problème. Je résume ci-dessous mon sentiment sur la raison pour laquelle le problème persiste :

  1. Ceux qui débutent peuvent ne pas avoir conscience de l'injection SQL.

  2. Certains sont conscients de l'injection SQL, mais pensent que l'échappement est la (seule ?) solution. Si vous effectuez une recherche rapide sur Google pour php mysql query la première page qui apparaît est la page mysql_query sur laquelle se trouve un exemple qui montre l'interpolation d'une entrée utilisateur échappée dans une requête. Il n'est pas fait mention (du moins pas à ma connaissance) de l'utilisation d'instructions préparées à la place. Comme d'autres l'ont dit, il y a tellement de tutoriels qui utilisent l'interpolation de paramètres, qu'il n'est pas vraiment surprenant que cette méthode soit encore utilisée.

  3. Un manque de compréhension du fonctionnement des déclarations paramétrées. Certains pensent qu'il s'agit simplement d'un moyen sophistiqué d'échapper des valeurs.

  4. D'autres connaissent les déclarations paramétrées, mais ne les utilisent pas parce qu'ils ont entendu dire qu'elles étaient trop lentes. Je soupçonne que de nombreuses personnes ont entendu dire que les instructions paramétrées sont incroyablement lentes, mais n'ont pas fait de tests par elles-mêmes. Comme Bill Karwin l'a souligné dans son exposé, la différence de performances devrait rarement être utilisée comme facteur dans l'examen de l'utilisation des instructions préparées. Les avantages de préparer une fois, exécuter plusieurs fois On semble souvent oublier les améliorations en matière de sécurité et de maintenabilité du code.

  5. Certains utilisent partout des instructions paramétrées, mais avec interpolation de valeurs non vérifiées telles que les noms de tables et de colonnes, les mots-clés et les opérateurs conditionnels. Les recherches dynamiques, telles que celles qui permettent aux utilisateurs de spécifier un certain nombre de champs de recherche différents, de conditions de comparaison et d'ordre de tri, en sont des exemples parfaits.

  6. Faux sentiment de sécurité lors de l'utilisation d'un ORM. Les ORM permettent toujours l'interpolation de parties d'instructions SQL - voir 5.

  7. La programmation est un sujet vaste et complexe, la gestion des bases de données est un sujet vaste et complexe, la sécurité est un sujet vaste et complexe. Le développement d'une application de base de données sécurisée n'est pas facile - même les développeurs expérimentés peuvent être pris au dépourvu.

  8. De nombreuses réponses sur stackoverflow ne sont d'aucune aide. Lorsque les gens écrivent des questions qui utilisent le SQL dynamique et l'interpolation de paramètres, il y a souvent un manque de réponses qui suggèrent d'utiliser des instructions paramétrées à la place. À quelques reprises, j'ai vu des personnes réfuter ma suggestion d'utiliser des instructions préparées - généralement en raison de la perception d'une surcharge de performance inacceptable. Je doute sérieusement que les personnes qui posent la plupart de ces questions soient dans une situation où les quelques millisecondes supplémentaires nécessaires à la préparation d'une instruction paramétrée auront un effet catastrophique sur leur application.

2voto

Markus Winand Points 2887

Je ne dirais pas "stupide".

Je pense que les tutoriels sont le problème. La plupart des tutoriels SQL, des livres, etc. expliquent le SQL avec des valeurs soulignées, sans mentionner du tout les paramètres de liaison. Les personnes qui apprennent à partir de ces didacticiels n'ont pas la possibilité d'apprendre correctement.

2 votes

Ce n'est pas suffisant. Pourquoi les gens n'utilisent pas de framework ou autre ? Pourquoi ne testent-ils pas les "injections stupides" avec un testeur stupide ? Parce que parfois le patron ne vous paie pas bien ou il vous paie X argent pour un projet et vous devez courir d'un projet à un autre et d'un projet à un autre pour obtenir de l'argent. Vous devez être de plus en plus rapide. Le codeur est stressé et surmené, donc le code fonctionne mais il est mal écrit.

2voto

evil otto Points 6069

Parce que la plupart du code n'est pas écrit avec la sécurité à l'esprit, et la direction, si elle a le choix entre ajouter des fonctionnalités (surtout quelque chose de visible qui peut être vendu) et la sécurité/stabilité/fiabilité (qui est beaucoup plus difficile à vendre), elle choisira presque invariablement la première. La sécurité n'est une préoccupation que lorsqu'elle devient un problème.

1voto

Fahad Hussain Points 586

Pour protéger votre application contre l'injection SQL, effectuez les étapes suivantes :

Étape 1. Contrainte de l'entrée. Étape 2. Utilisez des paramètres avec des procédures stockées. Étape 3. Utilisation de paramètres avec le SQL dynamique.

Se référer à http://msdn.microsoft.com/en-us/library/ff648339.aspx

8 votes

Les procédures stockées seules ne sont pas vraiment une aide. Il est possible de construire des chaînes de requête de manière dynamique dans une procédure stockée, tout comme dans le code client.

0 votes

@Fahad Je pourrais reformuler le point 2 comme suit : "Utilisez des instructions paramétrées dans les requêtes et dans les procédures stockées." +1 au commentaire de Novelocrat que l'utilisation de procédures stockées sans paramètres ne vous apporte pas grand chose.

0voto

jmoreno Points 6995

Non, les requêtes paramétrées n'empêchent pas toutes les injections sql - certaines requêtes dynamiques sont composées dans des procédures stockées dans la base de données.

Quant à la raison pour laquelle nous avons toujours l'injection sql : de vieux (mauvais) exemples, des langages et des systèmes qui ne supportent pas la paramétrisation, et le fait que réparer quelque chose qui fonctionne est plus difficile à vendre que de nouvelles fonctionnalités/corrections de bugs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X