mir enthalten scheint es, als eine einfache Abfrage eine Zeile mit spezifischer ID bekam
Das ist die Magie der Injektion. Die Abfrage sollte nur eine Zeile erhalten, die ein bestimmtes Kriterium erfüllt, das von einer Anfrage kommt (wie ein GET oder POST von HTML zum Beispiel).
So request.getParameter("id")
bietet einen Parameter vom Benutzer (oder ein sehr böser Typ).
Normalerweise wer schrieb, dass der Frieden von Code so etwas wie dies zu erwarten:
id = 12
, die in
SELECT * FROM accounts WHERE custID='12'
Jetzt Bild ergeben würde, was, wenn der Benutzer geschieht (ein schlechter in diesem Fall) sendet dies stattdessen:
id = 0'; DROP TABLE accounts; --
Diese wou ld ausführen als
SELECT * FROM accounts WHERE custID='0'; DROP TABLE accounts; --'
Schritt-für-Schritt:
- Sicherstellen, dass die beabsichtigte Abfrage ohne Fehler ausgeführt (
0
)
- die Abfrage vor dem geplanten Endpunkt (
';
)
- Inject Ihr bösartiger Code (
DROP TABLE accounts;
)
- Stellen Sie sicher, dass alles, was von der ursprünglichen Abfrage übrig ist, als Kommentar behandelt wird (
--
)
Das Problem in dem OWASP Beispiel ist die Abfrage nicht selbst, sondern die Tatsache, daß Parameter, die von ‚außen‘ kommen (request.getParameter("id")
) werden verwendet, um eine Abfrage zu erzeugen, ohne irgendwelche potentiellen Steuerzeichen entweicht.
Diese Art des Schreibens Code ermöglicht grundsätzlich jedem Benutzer Code auf Ihrem SQL-Server ausführen.
Ich glaube, Sie vermissen den Punkt der SQL-Injection enthalten könnte: Es geht um Code ist * nicht * in der Ausführung durch Anwendung . Beginnen Sie mit der Wikipedia-Seite: https://en.wikipedia.org/wiki/SQL_injection. –
Ich denke, das Ihnen zur Verfügung gestellte Beispiel ist schlecht. Anstatt Ihnen ein richtiges Beispiel für SQL-Injection zu geben, wie zum Beispiel 'OR 1 == 1;' (return * all * records), haben sie scheinbar Java-Code bereitgestellt. –