dedlfix: Hilfe - SQL syntax

Beitrag lesen

Hi!

Was ist daran ".mysql_real_escape_string($_GET["ID"]);" falsch?
$ergebnis = mysql_query( "SELECT * FROM FW_Fehlerbericht WHERE ID = ".mysql_real_escape_string($_GET["ID"]);

..mhh, tut mir leid ich raffe es einfach nicht was geändert werden muß.

Dann hast du das Problem an sich noch nicht verstanden und es wäre schön, was du an dem verlinkten Artikel nicht verstanden hast, so dass ich das für eine (eventuelle) Überarbeitung berücksichtigen kann.

mysql_real_escape_string() ist dafür da, einige innerhalb eines String vorkommende Zeichen so zu umzuschreiben, dass sie weder den String beenden noch anderweitig missverständlich für den SQL-Statement-Interpreter sind. Nun gedenkst du aber eine Zahl zu übergeben und lässt deshalb die stringbegrenzenden Anführungszeichen weg. Für die Zahl ist das kein Problem, wenn du sicherstellst, dass es wirklich eine Zahl ist, was beispielsweise mit intval() erreicht werden kann.

Da du keinen String anfängst, ist es so wie es jetzt ist, für einen Angreifer überhaupt kein Problem, SQL-Injection auszuführen, weil du immer noch im Code-Modus bist und nicht mit den Anführungszeichen den String-Modus eingeleitet hast.

SELECT * FROM tabelle WHERE ID = benutzereingabe
SELECT * FROM tabelle WHERE ID = 0 OR ...
SELECT * FROM tabelle WHERE ID = '0 OR ...'

Der Unterschied ist nun, dass in Zeile 3 das >0 OR ...< als String angesehen wird und maximal ein falsches Ergebnis liefert, in Zeile 2 aber als Code interpretiert wird. Das mysql_real_escape_string() hilft an der Stelle nichts, weil es an der Eingabe nichts verändert. Es kommen einfach keine Zeichen vor, die davon behandelt werden müssen. Selbst Strings kann man ohne Anführungszeichen notieren, wenn diese für einen Angriff notwendig wären.

Alternativ zum intval() kannst du auch die Zahl als String notieren, also mit Anführungszeichen drumrum, dann kannst und solltest du auch wieder mysql_real_escape_string() verwenden.

Lo!