Sicherheit: SQL Injection
-
Ich arbeite grad mit MySQL und beschäftige mich mit dem Thema Sicherheit.
Ich weiß, dass man seine SQL Abfragen mittels mysql_real_escape_string() gegen SQL Injections absichern kann.
Gibt ja schließlich genug Lektüre dazu.Ich habe aber noch ein paar Stellen im System, in der ich die obige Funktion noch nicht verwende.
An diesen Stellen habe ich versucht mit einer SQL Injection anzusetzen, um eine SQL Injection mal in der Praxis durchzuführen.Doch leider funktioniert es nicht..
Ich hoffe, dass mir jemand erklären kann, woran das liegen könnte.Hier mal der php Code:
mysql_query("INSERT INTO tbl_test (test_id, test_name, test_comment) VALUES('$id', '$name', '$comment');");
Wenn ich jetzt im Formular einen string für die Variable $comment eintrage, welcher wie folgt aussieht:
x'); DROP TABLE deltest#
und das Formular absende, wird die Abfrage zwar (anscheinend) ausgeführt aber weder die Tabelle deltest wurde gelöscht,
noch wurde ein neuer Datensatz der Tabelle tbl_test hinzugefügt.Hier die Zusammengesetzte Abfrage, zur besseren Übersicht:
INSERT INTO tbl_test (test_id, test_name, test_comment) VALUES('1', 'foo', 'bar'); DROP TABLE deltest#');
Wenn ich die zusammengesetzte Abfrage per PHPMyAdmin ausführe, funktioniert sie.
Wenn diese aber im php Code mittels mysql_query() ausgeführt wird nicht.Kann mir jemand sagen, wieso diese SQL Injection nicht funktioniert?
Arbeitet mysql_query() die Abfrage evt. nur bis zum ersten Semikolon ab?
-
jopp:
http://de.php.net/manual/en/function.mysql-query.php schrieb:
mysql_query() sends an unique query (multiple queries are not supported)
-
Danke, wie konnte ich das nur übersehen..
Somit minimieren sich ja schon die Möglichkeiten der SQL Injections um einen Großteil.Bei einer INSERT INTO, über die ausschließlich Formulardaten des Benutzers eingetragen werden,
dürfte es doch dann keinen Angriffspunkt mehr geben
oder habe ich noch eine Möglichkeit übersehen, mit der man dann Schaden anrichten könnte?
Alle VALUES per SQL Injection zu setzen, würde in dem Falle ja nicht wirklich etwas bringen.
-
Van-Fanel schrieb:
oder habe ich noch eine Möglichkeit übersehen, mit der man dann Schaden anrichten könnte?
Bei insert into gibt es weniger angriffspunkte, bei replace dagegen schon.
oder stell dir einselect is_admin from users where uid='$id'
und $id hat den wert ' or uid=1
wenn 1 immer admin ist, zBnicht jede ungeprüfte user eingabe ist zwangsläufig eine ausnutzbare lücke. aber potentiell ist es eine - und das ist der punkt.
-
Ok, dann vielen Dank.
Wieder ein bisschen klüger.