htmlentities() vs htmlspecialchars(): Der Kampf der PHP-Funktionen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

htmlentities() vs. htmlspecialchars(): Ausführlicher Leitfaden mit Beispielen

\n\n

Haben 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.

\n\n

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\n

Los geht's!

\n\n

Was machen diese Funktionen überhaupt?

\n\n

Beide 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\n

Zum Beispiel wird das Zeichen < zu &lt;. Dies ist entscheidend für:

\n
    \n
  • Sicherheit — Schutz vor XSS-Angriffen (Cross-Site-Scripting)
  • \n
  • Korrekte Darstellung — damit Ihr Text das HTML-Markup nicht „zerstört“
  • \n
\n\n

Aber hier ist der Haken: htmlspecialchars() arbeitet nur mit vier Zeichen, während htmlentities() mit allen bekannten HTML-Entitäten arbeitet.

\n\n

htmlspecialchars(): Die leichte Artillerie

\n\n

Die Funktion htmlspecialchars() wandelt nur diese Zeichen um:

\n
    \n
  • & (Kaufmanns-Und) → &amp;
  • \n
  • " (doppeltes Anführungszeichen) → &quot; (wenn das Flag ENT_NOQUOTES nicht gesetzt ist)
  • \n
  • ' (einfaches Anführungszeichen) → &#039; (wenn das Flag ENT_QUOTES gesetzt ist)
  • \n
  • < (kleiner als) → &lt;
  • \n
  • > (größer als) → &gt;
  • \n
\n\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: &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;\n?>
\n\n

htmlentities(): Die schwere Kavallerie

\n\n

htmlentities() ist der Perfektionist, der alle Zeichen mit einem HTML-Äquivalent in Entitäten umwandelt. Zum Beispiel Währungssymbole (€, £, ¥), mathematische Zeichen (∑, ∞, √) und sogar Pfeile (←, ↑).

\n\n
<?php\n$text = 'Kosten: 50€';\necho htmlentities($text, ENT_QUOTES, 'UTF-8');\n// Gibt aus: Kosten: 50&euro;\n?>
\n\n

Hö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.

\n\n

Der entscheidende Unterschied: Kodierung

\n\n

Und 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).

\n\n

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.

\n\n
<?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\n

Wann verwende ich was?

\n\n

Blogs

Buchempfehlungen