htmlentities()
Die Funktion htmlentities() wandelt Sonderzeichen in ihre entsprechenden HTML-Entitäten um und schützt so vor XSS-Angriffen in PHP-Anwendungen.
Die PHP-Funktion htmlentities() wandelt jedes Zeichen, das eine benannte HTML-Entität besitzt, in diese Entität um. Sie ist das wichtigste Werkzeug zur sicheren Ausgabe nicht vertrauenswürdiger Texte — etwa Benutzereingaben aus einem Formular — innerhalb einer HTML-Seite, da sie Zeichen, die der Browser andernfalls als Markup interpretieren würde (<, >, &, Anführungszeichen), in harmlosen sichtbaren Text umwandelt. Das macht sie zur ersten Verteidigungslinie gegen Cross-Site-Scripting (XSS).
Diese Seite behandelt die Syntax, jeden der vier Parameter, den praktischen Unterschied zu htmlspecialchars() sowie häufige Fallstricke rund um Zeichenkodierung und Doppelkodierung.
Syntax
htmlentities(
string $string,
int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
?string $encoding = null,
bool $double_encode = true
): stringDie Funktion gibt einen neuen String zurück, in dem die betreffenden Zeichen konvertiert wurden; der ursprüngliche String wird nicht verändert.
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
$string | Ja | Der zu kodierende Eingabe-String. |
$flags | Nein | Legt fest, wie Anführungszeichen behandelt werden und welcher Dokumenttyp verwendet wird. Siehe die Flags weiter unten. |
$encoding | Nein | Der Zeichensatz der Eingabe (z. B. "UTF-8"). Standardmäßig wird die ini-Einstellung default_charset verwendet. |
$double_encode | Nein | Bei false werden Zeichen, die bereits Teil einer bestehenden Entität sind, unverändert gelassen. |
Hinweis: Ab PHP 8.1 sind die Standard-Flags
ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401. Unter PHP 8.0 und älter war der StandardENT_COMPAT | ENT_HTML401, der einfache Anführungszeichen nicht kodiert. Wenn Sie ältere Versionen unterstützen, übergeben SieENT_QUOTESexplizit.
Grundlegende Verwendung
Die Ausgabe lautet:
Hello <strong>World</strong>!Die Zeichen < und > sind nun < und >, sodass der Browser sie als wörtlichen Text darstellt, anstatt ein echtes <strong>-Tag zu öffnen.
Der Parameter $flags — Umgang mit Anführungszeichen
Der zweite Parameter steuert, wie Anführungszeichen behandelt werden. Die wichtigsten Flags sind:
| Flag | Einfache Anführungszeichen (') | Doppelte Anführungszeichen (") |
|---|---|---|
ENT_QUOTES | Kodiert | Kodiert |
ENT_COMPAT | Unverändert | Kodiert |
ENT_NOQUOTES | Unverändert | Unverändert |
Verwenden Sie ENT_QUOTES, wenn die Ausgabe in einem einfach-gequoteten HTML-Attribut landen könnte, da andernfalls ein ' in den Daten aus dem Attribut ausbrechen könnte.
Ausgabe:
I'm a paragraphDas einfache Anführungszeichen wird zu '. Mit dem älteren Standard ENT_COMPAT wäre es als wörtliches ' erhalten geblieben.
Der Parameter $encoding
Der dritte Parameter teilt htmlentities() mit, welchen Zeichensatz die Eingabe verwendet, damit Multibyte-Zeichen korrekt abgebildet werden können. Setzen Sie diesen für moderne Anwendungen immer explizit auf "UTF-8" — eine falsch angegebene Kodierung kann die Ausgabe stillschweigend verfälschen oder in älteren PHP-Versionen einen leeren String zurückliefern.
Ausgabe:
Café & «über»Beachten Sie, wie é, «, ü und » jeweils in ihre benannten Entitäten umgewandelt wurden — dies ist das Verhalten, das htmlentities() von htmlspecialchars() unterscheidet, welches diese akzentuierten Zeichen unverändert lassen würde.
Der Parameter $double_encode
Standardmäßig (true) kodiert htmlentities() das & in einer bestehenden Entität erneut, sodass aus < die Zeichenfolge &lt; wird. Übergeben Sie false, um bereits kodierte Entitäten unverändert zu lassen — nützlich, wenn ein Teil Ihres Strings absichtlich vorab maskiert ist.
Mit $double_encode auf false werden die bestehenden Entitäten unverändert durchgereicht:
Hello <strong>World</strong>!Hätten Sie $double_encode auf dem Standardwert true belassen, wäre jedes & erneut zu & maskiert worden und das Ergebnis wäre Hello &lt;strong&gt;... gewesen.
htmlentities() vs. htmlspecialchars()
Dies ist der häufigste Punkt der Verwirrung:
htmlspecialchars()konvertiert nur die fünf Zeichen mit besonderer Bedeutung in HTML:&,<,>,"und'.htmlentities()konvertiert diese plus jedes weitere Zeichen, das eine benannte Entität besitzt (akzentuierte Buchstaben, Symbole, Währungszeichen usw.).
Für die sichere Maskierung von Ausgaben ist htmlspecialchars() in der Regel die bessere Wahl: Sie ist kleiner, schneller und — solange Sie eine UTF-8-Seite ausgeben — werden akzentuierte Zeichen korrekt angezeigt, ohne in Entitäten umgewandelt zu werden. Greifen Sie nur dann auf htmlentities() zurück, wenn Sie gezielt alle entitäts-abbildbaren Zeichen konvertieren müssen, beispielsweise bei der Erzeugung von Inhalten für ein Ziel, dessen Zeichensatz Sie nicht kontrollieren können.
Um die Konvertierung rückgängig zu machen, verwenden Sie html_entity_decode() oder htmlspecialchars_decode().
Wichtige Punkte
htmlentities()gibt einen neuen String zurück und verändert den ursprünglichen niemals.- Übergeben Sie
ENT_QUOTESund"UTF-8"immer explizit für vorhersehbare, sichere Ausgaben über alle PHP-Versionen hinweg. - Es handelt sich um einen Ausgabe-Filter — maskieren Sie Daten beim Ausgeben, nicht beim Speichern.
- Für typische HTML-Maskierung bevorzugen Sie
htmlspecialchars().