PHP, mysql_real_escape_string - Externe Hilfe

Das Problem:

Ein Kunde hatte das Problem, dass scheinbar falsche Symbole für Zeilenbrüche aus seiner Datenbank geliefert wurde. Er beklagte sich, der PHP-Befehl  nl2br(string) würde nicht wie erwartet funktionieren.

Eine Nachschau der Daten ergab, dass nicht wie erwartet "\n" in der Datenbank stand sondern "\\n". Klar, da konnte nl2br() natürlich nicht sein Werk tun.

Die technische Ursache war dann schnell gefunden:

Das PHP-Skript, welches für den Eintrag der Daten in die Datenbank genutzt wurde, sah (stark verkürzt) wie folgt aus:

$value=mysql_real_escape_string($_REQUEST['value']);
[...]
$sql='SELECT `spalte` FROM `tabelle` WHERE `spalte`=="' . mysql_real_escape_string($value) .'"';

Das war genau einmal "mysql_real_escape_string()" zu viel.  Vermutlich hatte der Programmierer zunächst am Beginn des Skriptes den Befehl verwendet um die Daten für MySql sicher zu machen und später ist ihm oder einem anderen aufgefallen, dass an der Stelle, wo die SQL-Anweisung zusammengebastelt wird, das Escapen nicht stattfindet. Er hat es mit dem Gedanken an ein vermutetes Sicherheitsproblem "rasch nachgetragen".

Eigentliche Ursache und Lösung:

Vermutlich wollte der Programmierer ursprünglich das die Zeile, in welcher die SQL-Anweisung "gebaut" wird, nicht zu lang wird, denn auch diese habe ich Beispielcode stark verkürzt. Dabei ist es aber die bessere und einfachere Idee, genau diese "Befehlszeile" einfach auf mehrere Zeilen zu verteilen:

$sql='
SELECT `spalte`
FROM   `tabelle`
WHERE  `spalte` == "' . mysql_real_escape_string($_REQUEST['value']) .'"';

Das sieht gut aus, ist übersichtlich und es funktioniert auch. Das "mysql_real_escape_string()" gehört genau diese Stelle und nur dorthin - wenngleich es anderswo zunächst einmal funktioniert... Die endgültige Lösung ist also, sich einen guten Programmierstil anzugewöhnen.


Weitere Informationen in diesem Bereich: