Raw SQL
Lorsque vous écrivez du SQL - pour tout ce qui nécessite vraiment une intervention humaine, beaucoup de choses ont été faites pour éviter l'injection.
Tous ceux qui sont entendus d'injection SQL sait que (je vais utiliser PHP comme exemple) faire quelque chose comme ça n'est pas sûr:
$ sql = "SELECT * FROM ʻusers`. WHERE ʻuserName `=" {$ _POST ["username"]} ". AND` pass` = "{$ _POST [" pass "]}"; ";
Magic
Ensuite, bien sûr, quelqu'un a eu l'idée d'utiliser des "guillemets magiques" pour traiter les entrées de programme qui n'étaient pas correctement nettoyées et directement placées dans SQL en raison de mauvaises pratiques. Cela n'a pas vraiment résolu le problème avec l'injection SQL, mais cela a signifié que toutes les entrées utilisateur ont été mutilées.
Ajout de barres obliques
Ainsi, certaines personnes ont désactivé les guillemets magiques. Ensuite, ils ont analysé l'entrée de l'utilisateur avant le point de SQL via ajoutelashes ()
qui en théorie échappe à toutes les citations et votre pirate ne peut pas faire 'OR 1 = 1
, mais même la documentation pour les addlashes dit que vous ne devriez pas utiliser les addlashes, elle dit utiliser la fonction spécifique à la base de données telle que mysql_real_escape_string ()
, mais cela est toujours dit que ce n'est pas suffisant par certains.
Ajout de barres obliques spécifiques à la base de données
Donc, nous ne pouvons pas utiliser * _real_escape_string
spécifique au SGBD, nous ne pouvons pas utiliser ajouter des barres obliques
, le truc des "citations magiques" a causé beaucoup de problèmes, et le Web regorge de citations courtes telles que:
"Un hacker dédié trouvera un moyen de sauter par-dessus votre citation boucles, utilisez simplement les instructions préparées par DBAL "- John Q n'importe quel programmeur
D'accord, cela m'a suffisamment effrayé pour utiliser des instructions prepare et un DBAL. Cela n'expliquait vraiment rien, mais cela sonne bien parce que je l'ai beaucoup entendu.
Instructions préparées
Nous utilisons maintenant PDO, ou un DBAL d'un framework, ou quelque chose d'autre qui encapsule tout notre SQL et s'assure que quelqu'un ne peut pas exécuter une injection SQL.
Ma question est essentiellement un "pourquoi pas?", pas un "que dois-je utiliser?". Le Web regorge de gens qui vous disent d'utiliser ceci ou d'utiliser cela ou quoi que ce soit , mais aucune explication sur les raisons pour lesquelles ces choses ont dû se produire.
Questions directes
Questions pointues (rappel, je pose des questions sur SQL, PHP était un exemple de langage à cause de sa mauvaise représentation autour de SQL, les concepts sont universels):
- Pourquoi ne pouvons-nous pas échapper à toutes les entrées utilisateur en utilisant "magic"?
- Pourquoi les addlashes n'étaient-ils pas "assez bons"?
- Quel est le problème avec l'utilisation des fonctions d'échappement spécifiques à la base de données, et pourquoi était-ce mieux que les addlashes?
- Pourquoi les instructions préparées avec des frameworks et PDO sont-elles saluées comme l'étalon-or de SQL? Pourquoi sont-ils meilleurs? Pourquoi ne puis-je pas faire une injection SQL avec ceux-ci, comme je pourrais le faire avec les moyens mentionnés précédemment? Un programmeur ne parvient-il pas en quelque sorte à tout gâcher? À quoi doivent-ils faire attention?
- Y a-t-il d'autres problèmes que je n'ai pas soulevés?