htmlentities() vs. htmlspecialchars(): Ausführlicher Leitfaden mit Beispielen
\n\nHaben Sie sich jemals gefragt, warum es in PHP zwei Funktionen gibt, die scheinbar dasselbe tun? htmlentities() und htmlspecialchars() sind wie zwei Zwillingsbrüder: äußerlich ähnlich, aber mit unterschiedlichen Charakteren. Und die Wahl zwischen ihnen kann entweder Ihre Superhelden-Fähigkeit oder eine Quelle von Kopfschmerzen sein.
Wenn Sie diese Frage jemals auf Stack Overflow gestellt haben (und das tun Tausende!), wissen Sie, dass die Antwort nicht immer offensichtlich ist. Heute klären wir ein für alle Mal, wofür welche Funktion gedacht ist, wann Sie welche verwenden sollten und wie Sie mit Kodierungen nicht in die Falle tappen.
\n\nLos geht's!
\n\nWas machen diese Funktionen überhaupt?
\n\nBeide Funktionen dienen dem Escaping von HTML-Zeichen. Einfach ausgedrückt: Sie wandeln Sonderzeichen in ihre HTML-Entitäten um, damit der Browser sie als Text anzeigt und nicht als Code interpretiert.
\n\nZum Beispiel wird das Zeichen < zu <. Dies ist entscheidend für:
- \n
- Sicherheit — Schutz vor XSS-Angriffen (Cross-Site-Scripting) \n
- Korrekte Darstellung — damit Ihr Text das HTML-Markup nicht „zerstört“ \n
Aber hier ist der Haken: htmlspecialchars() arbeitet nur mit vier Zeichen, während htmlentities() mit allen bekannten HTML-Entitäten arbeitet.
htmlspecialchars(): Die leichte Artillerie
\n\nDie Funktion htmlspecialchars() wandelt nur diese Zeichen um:
- \n
&(Kaufmanns-Und) →&\n "(doppeltes Anführungszeichen) →"(wenn das Flag ENT_NOQUOTES nicht gesetzt ist) \n '(einfaches Anführungszeichen) →'(wenn das Flag ENT_QUOTES gesetzt ist) \n <(kleiner als) →<\n >(größer als) →>\n
Dieser Satz reicht für 99% der Fälle. Warum? Weil nur diese Zeichen eine besondere Bedeutung im HTML-Markup haben und Ihre Seite zerstören können.
\n\n<?php\n$user_input = '<script>alert("XSS")</script>';\necho htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');\n// Gibt aus: <script>alert("XSS")</script>\n?>\n\nhtmlentities(): Die schwere Kavallerie
\n\nhtmlentities() ist der Perfektionist, der alle Zeichen mit einem HTML-Äquivalent in Entitäten umwandelt. Zum Beispiel Währungssymbole (€, £, ¥), mathematische Zeichen (∑, ∞, √) und sogar Pfeile (←, ↑).
<?php\n$text = 'Kosten: 50€';\necho htmlentities($text, ENT_QUOTES, 'UTF-8');\n// Gibt aus: Kosten: 50€\n?>\n\nHört sich praktisch an, oder? Aber es gibt einen Haken — die Leistung. htmlentities() arbeitet langsamer, weil es mehr Zeichen verarbeitet. Und wenn Ihre Website Tausende von Zeilen verarbeitet, wird der Unterschied spürbar.
Der entscheidende Unterschied: Kodierung
\n\nUnd hier kommen wir zum wichtigsten Punkt. Beide Funktionen akzeptieren einen dritten Parameter — die Kodierung. Und wenn Sie ihn nicht angeben, verwendet PHP den Wert aus der Direktive default_charset in der php.ini (normalerweise UTF-8).
Aber htmlentities() ist besonders empfindlich gegenüber der Kodierung. Wenn Sie eine falsche Kodierung angeben, kann die Funktion Zeichen inkorrekt umwandeln. Zum Beispiel gehen bei ISO-8859-1 einige UTF-8-Zeichen verloren.
<?php\n// Schlechtes Beispiel: Kodierung nicht angegeben\necho htmlentities('Hallo, Welt!'); // Kann eine Warnung ausgeben\n\n// Gutes Beispiel: Geben Sie immer die Kodierung an\necho htmlentities('Hallo, Welt!', ENT_QUOTES, 'UTF-8');\n?>\n\nWann verwende ich was?
\n\n