À mon avis, les attaques par injection SQL peuvent être évitées par:
- Filtrer, filtrer et encoder soigneusement les entrées (avant leur insertion dans SQL)
- Utilisation d' instructions préparées / requêtes paramétrées
Je suppose qu'il y a des avantages et des inconvénients pour chacun, mais pourquoi le n ° 2 a-t-il décollé et est-il considéré comme un moyen plus ou moins efficace de prévenir les attaques par injection? Est-ce simplement plus sûr et moins sujet aux erreurs ou y avait-il d'autres facteurs?
Si je comprends bien, si le n ° 1 est utilisé correctement et que toutes les mises en garde sont prises en compte, cela peut être tout aussi efficace que le n ° 2.
Désinfection, filtrage et encodage
Il y avait une certaine confusion de ma part entre ce que signifiait désinfection , filtrage et codage . Je dirai que, pour mes besoins, tout ce qui précède peut être pris en compte pour l'option 1. Dans ce cas, je comprends que la désinfection et le filtrage peuvent modifier ou supprimer les données d'entrée, tandis que le codage conserve les données telles quelles, mais les code. correctement pour éviter les attaques par injection. Je crois que les données en échappée peuvent être considérées comme un moyen de les encoder.
Requêtes paramétrées vs bibliothèque de codage
Il y a des réponses où les concepts de parameterized queries
et encoding libraries
qui sont traités de manière interchangeable. Corrigez-moi si je me trompe, mais j'ai l'impression qu'ils sont différents.
D'après ce que je comprends encoding libraries
, même s'ils sont bons, ils ont toujours le potentiel de modifier le "Programme" SQL, car ils modifient le code SQL lui-même avant qu'il ne soit envoyé au SGBDR.
Parameterized queries
d'autre part, envoyez le programme SQL au SGBDR, qui optimise ensuite la requête, définit le plan d'exécution de la requête, sélectionne les index à utiliser, etc., puis connecte les données, en tant que dernière étape du SGBDR. lui-même.
Bibliothèque de codage
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
Requête paramétrée
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
Importance historique
Certaines réponses mentionnent qu'historiquement, les requêtes paramétrées (PQ) étaient créées pour des raisons de performances et avant que les attaques par injection ciblant des problèmes de codage ne deviennent populaires. À un moment donné, il est devenu évident que le PQ était également assez efficace contre les attaques par injection. Pour rester dans l’esprit de ma question, pourquoi PQ est-il resté la méthode de choix et pourquoi at-il prospéré au-dessus de la plupart des autres méthodes en matière de prévention des attaques par injection SQL?