So wie ich das sehe, können SQL-Injection-Angriffe verhindert werden durch:
- Sorgfältiges Prüfen, Filtern und Codieren von Eingaben (vor dem Einfügen in SQL)
- Verwendung von vorbereiteten Anweisungen / parametrisierten Abfragen
Ich nehme an, dass es für jeden das Für und Wider gibt, aber warum hat sich # 2 durchgesetzt und wurde mehr oder weniger als der tatsächliche Weg zur Verhinderung von Injektionsangriffen angesehen? Ist es nur sicherer und weniger fehleranfällig oder gab es andere Faktoren?
Soweit ich weiß, kann # 1 genauso effektiv sein wie # 2, wenn man es richtig anwendet und alle Vorbehalte beachtet.
Bereinigen, Filtern und Codieren
Ich war verwirrt darüber, was Bereinigen , Filtern und Codieren bedeutete. Ich werde sagen , dass für meine Zwecke, die alle der oben für Option 1. In diesem Fall in Betracht gezogen wird Ich verstehe , dass Hygienisierung und Filterung das Potenzial hat , zu ändern oder zu verwerfen Eingangsdaten, während Codierung erhalten Daten , wie sie ist , sondern kodiert sie richtig, um Injektionsangriffe zu vermeiden. Ich glaube, dass das Entkommen von Daten als eine Art der Verschlüsselung angesehen werden kann.
Parametrisierte Abfragen vs. Codierungsbibliothek
Es gibt Antworten, bei denen Konzepte von parameterized queries
und encoding libraries
die austauschbar behandelt werden. Korrigieren Sie mich, wenn ich falsch liege, aber ich habe den Eindruck, dass sie unterschiedlich sind.
Mein Verständnis ist, dass sie encoding libraries
, egal wie gut sie sind, immer das Potenzial haben , SQL "Program" zu ändern, weil sie Änderungen an SQL selbst vornehmen, bevor es an das RDBMS gesendet wird.
Parameterized queries
Senden Sie andererseits das SQL-Programm an das RDBMS, das dann die Abfrage optimiert, den Abfrageausführungsplan definiert, die zu verwendenden Indizes usw. auswählt und dann die Daten als letzten Schritt im RDBMS einfügt selbst.
Codierungsbibliothek
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
Parametrisierte Abfrage
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
Historische Bedeutung
In einigen Antworten wird erwähnt, dass in der Vergangenheit aus Leistungsgründen parametrisierte Abfragen (PQ) erstellt wurden und bevor Injection-Angriffe, die auf Codierungsprobleme abzielten, populär wurden. Irgendwann stellte sich heraus, dass PQ auch gegen Injektionsattacken ziemlich wirksam war. Um dem Geist meiner Frage gerecht zu werden, warum blieb PQ die Methode der Wahl und warum entwickelte es sich besser als die meisten anderen Methoden, wenn es darum geht, SQL-Injection-Angriffe zu verhindern?