Der Martin: PHP vernünftig escapen?

Beitrag lesen

Hallo,

für welchen konkreten Zweck? Ein Escaping, eine Maskierung oder Codierung verwendet man normalerweise, wenn man Daten von einem Kontext in einen anderen überführen will, z.B. PHP-String zu mySQL. Einfach "auf Verdacht" irgendwas escapen ist aber nicht sinnvoll, manchmal sogar nachteilig.
Nunja, Sinn und Zweck ist es, dass man in diesem selfmade Forum etwas eingeben soll.

das hatte ich schon verstanden; ich meinte die Frage konkreter: Welcher Zweck (welcher Zielkontext) soll es an genau dieser Stelle sein? Aber anscheinend hast du das trotzdem so verstanden, wie ich es meinte.

Gut, das habe ich jetzt verstanden. Also muss ich es so machen: 1. User gibt etwas ein, 2. real_escape_string(), damit der Kram ohne Probleme in die Datenbank geschrieben wird UND dabei keine Injection benutzt werden kann, 3. beim Auslesen aus der DB erst htmlentities & nl2br anwenden, da es ja jetzt erst an die HTML Anzeige geht und dementsprechend jetzt erst das ganze angezeigt werden soll. Richtig so?

Absolut richtig. Ich würde noch 'ne kleine Abweichung vorschlagen: Nimm htmlspecialchars() anstatt htmlentities(). Denn wie du selbst schon festgestellt hast, wandelt htmlentities() so ziemlich alles um, was als Entity-Referenz geschrieben werden kann. Das ist aber völlig unnötig - man möchte ja nachher nicht zahllose &auml; und &quot; und ähnlichen Ramsch im HTML-Quellcode haben, sondern lesbare Zeichen. Dagegen ersetzt htmlspecialchars() nur die Zeichen, bei denen das nötig ist, weil sie in HTML eine besondere Bedeutung haben. Das sind AFAIR nur '<' (wird zu &lt;), '>' (wird zu &gt;) und '&' (wird zu &amp;).

Es ist ein Trugschluss, dass nl2br() Zeilenumbrüche (\r) in <br> _umwandelt_, stattdessen fügt es nur ein <br /> hinzu und lässt den eigentlichen Zeilenumbruch noch stehen. Auf diese Weise entsteht auch im HTML-Quellcode ein Zeilenumbruch nach dem <br />.
Danke, hatte ich nicht gemerkt.

Ich hatte früher auch gedacht, nl2br() würde \r oder \r\n durch <br> ersetzen. Der Name der Funktion suggeriert das ja auch irgendwie.

Dann machst du noch weitere Fehler, die aus dem gezeigten Code nicht hervorgehen. Beispielsweise einen weiteren Aufruf von htmlentities(), der die & noch zu &amp; konvertiert.
Ja, das wars tatsächlich. Danke.

Okay, dann funktioniert die Glaskugel manchmal sogar, wenn sie trüb und fleckig ist. ;-)

Ciao,
 Martin

--
Vater Staat bringt uns noch alle unter Mutter Erde.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(