Sönke Tesch: N00b Frage in PHP, bitte helfen!

Beitrag lesen

Ich war mir nachher auch gar nicht mehr so sicher, ob denn die Werte überhaupt in Form eines Querys an MySQL übergeben werden. Leider gibt es zur tieferen Funktionsweise von mysql_connect im Handbich keine Informationen und so habe ich es dann mchher vergessen.

Funktionen aus externen Bibliotheken werden in PHP (leider) mehr oder weniger stur 1:1 übernommen. Von daher ist der richtige Ort zu Details einer Funktion nicht die PHP-Anleitung, sondern die der Funktionsbibliothek, in diesem Fall die von MySQL: http://www.mysql.com/doc/en/C_API_functions.html.

Welche Zeichen sind denn zulässig und welche können Schaden anrichten?

Zulässig für SQL-Textargumente sind ausnahmslos alle Zeichen; man sollte nur tunlichst darauf achten, welche Anführungszeichen genutzt werden, um diese Texte einzugrenzen. Diese müssen mit einem Rückstrich maskiert werden, denn beim Auftreten eines Anführungszeichens sucht der SQL-Parser einfach das nächste dieser Art und markiert dort das Ende des Textarguments. Kommt dieses Anführungszeichen jedoch auch im eigentlichen Text vor, würde der Text zu früh beendet werden - auf diese Art und Weise kann man die vorgegebenen Anführungszeichen des Programmieres aushebeln:

delete from abonnenten where name="$name"

Würde $name '" or 1=1 or "a"="' enthalten (ohne einfache Anführungszeichen, aber mit den doppelten), hätten wir im Endeffekt ohne escape_string() (oder add_slashes() bzw. deren PHP-Automatik-Äquivalent) folgenden Befehl:

delete from abonnenten where name="" or 1=1 or "a"=""

Kurz: Er löscht die komplette Tabelle.

Zum Einsetzen von Variableninhalten in SQL-Befehle ist mysql_escape_string() _immer_ Pflicht (Ausnahme: Man prüft vorher, ob es sich um einen numerischen Wert handelt).

Zulässig für Benutzernamen und Passwörter sind, soweit ich das in http://www.mysql.com/doc/en/User_names.html erkenne, ebenfalls alle Zeichen.
Diese Daten werden direkt an eine eigene MySQL-Funktion übergeben, müssen also nicht mit mysql_escape_string() "gesichert" werden - und dürfen auch nicht, denn sollte ein Name oder Passwort ein Anführungszeichen enthalten (warum auch immer), hat man ein Problem: 'Peter "Lustig"' ist nicht dasselbe wie 'Peter "Lustig"'.

Gruß,
  soenk.e