dedlfix: Frage zu MySQL und PHP

Beitrag lesen

Tach!

mysql_realescape($_GET['id'])
Einerseits heisst die Funktion mysql_real_escape_string() und andererseits ist hier ggf. ein casting nach (int) vernünftiger, da es sich bei der ID wohl hoffentlich nicht um einen String handelt.

Wieso "hoffentlich"? Eine ID muss identifizieren. Solange sie das tut, ist es egal, ob sie eine Zahl oder eine andere Zeichenfolge ist.

Escapen oder Casten ergibt möglicherweise daselbe Eregebnis. Aber am Ende nimmt sich beides nichts. Das SQL-Statement ist ein String und Zahlen darin müssen in jedem Fall erstmal geparst werden, egal ob sie in Anführungszeichen stehen oder nicht.

"SELECT * FROM Downloads WHERE id = " . mysql_realescape($_GET['id'])

Apropos Anführungszeichen. Ein Escapen bringt natürlich nichts, wenn der Wert nicht auch in Anführungszeichen eingeschlossen ist. Ohne diese ist man ja nicht im String-Kontext sondern immer noch im Befehlskontext. Bei einem $_GET['id'], das

42 AND 1

enthält, hätte die Escape-Funktion nichts zu tun und die SQL-Injection wäre trotz ihrer Verwendung gelungen.

Wenn Escapen, dann immer mit Anführungszeichen. Ob Escapen mit Anführungszeichen oder Typecast die bessere Wahl ist, lässt sich so leicht nicht sagen. In beiden Fälle wird früher beim expliziten Typecast) oder später (beim Typecast im SQL-Parser) ein ungültiger Wert zu 0 werden. Dazu muss man sich für den jeweiligen Anwendungsfall fragen, ob das Schaden anrichten kann oder nicht. Gegebenenfalls muss man nicht nur sein Statement sichern sondern auch die Eingabewerte einer genaueren Wertebereichsprüfung unterziehen.

dedlfix.