Wann htmlentities() anwenden?

05.12.2004 Als ich anfing, PHP zu lernen, stellte sich mir schon früh die Frage, wann genau man die Funktion htmlentities() anwenden sollte, mit der Sonderzeichen für die Ausgabe in HTML codiert werden. Wichtig ist dies nicht nur, damit Browser bei Nichtangabe des Zeichensatzes die betreffenden Zeichen trotzdem richtig anzeigen, sondern auch, damit die HTML-Steuerzeiche <, >, & und " maskiert werden und Cross-Site-Scripting, d.h. die Ausgabe von an anderer Stelle eingegebener bösartiger Scripte, auf diese Weise verhindert wird.

Als Autodidakt stieß ich bei meiner ersten Suche nach einer Antwort im Netz vorwiegend auf die Meinung, dass htmlentities() gleich nach Eingabe in Formularen anzuwenden ist. Der Text landet dann bereits html-codiert in der Datenbank und braucht zur Ausgabe nicht mehr codiert werden. Da in vielen Fällen die betreffenden Daten nur einmal eingegeben, aber oft ausgegeben werden, sei dies die ökonomischere Variante, da die Funktion nur einmal ausgeführt werden braucht, nämlich direkt nach der Eingabe. Mir leuchtete dies ein, so dass auch ich mich entschloss, vor der Datenbankeingabe die Daten entsprechend zu behandeln.

Mehrmals gab es später allerdings das Problem, dass ich Daten in das Format zurückverwandeln musste, welches sie vor der Eingabe in die Datenbank aufwiesen, da das HTML-Format oder andere Formatierungen für die Ausgabe ungeeignet waren.

Trägt mal einmal die Ausnahmefälle von der Regel HTML zusammen, so erkennt man, dass eine Anwendung von hmlentities vor der Eingabe (INSERT) in die Datenbank viele Probleme schafft. Ich hatte deswegen nach reiflicher Überlegung, die Scripte für mein neues Forum nochmal komplett überarbeitet - denn später ließe sich dies nur noch sehr schwer wieder korrigieren. Die Daten sind jetzt in einem neutralen Format gespeichert (d.h. lediglich behandelt durch addslashes(), um SQL Injections zu verhindern). Erst nach dem Auslesen (SELECT) aus der Datenbank werden die Daten für die jeweilige Ausgabe behandelt, das ist für mich inzwischen die sauberste Lösung.

Fragen zu diesem Themenbereich können in meinem PHP-SQL-Forum gestellt werden