W3docs

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
): string

Die Funktion gibt einen neuen String zurück, in dem die betreffenden Zeichen konvertiert wurden; der ursprüngliche String wird nicht verändert.

ParameterErforderlichBeschreibung
$stringJaDer zu kodierende Eingabe-String.
$flagsNeinLegt fest, wie Anführungszeichen behandelt werden und welcher Dokumenttyp verwendet wird. Siehe die Flags weiter unten.
$encodingNeinDer Zeichensatz der Eingabe (z. B. "UTF-8"). Standardmäßig wird die ini-Einstellung default_charset verwendet.
$double_encodeNeinBei 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 Standard ENT_COMPAT | ENT_HTML401, der einfache Anführungszeichen nicht kodiert. Wenn Sie ältere Versionen unterstützen, übergeben Sie ENT_QUOTES explizit.

Grundlegende Verwendung

php— editable, runs on the server

Die Ausgabe lautet:

Hello &lt;strong&gt;World&lt;/strong&gt;!

Die Zeichen < und > sind nun &lt; und &gt;, 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:

FlagEinfache Anführungszeichen (')Doppelte Anführungszeichen (")
ENT_QUOTESKodiertKodiert
ENT_COMPATUnverändertKodiert
ENT_NOQUOTESUnverändertUnverä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.

php— editable, runs on the server

Ausgabe:

I&#039;m a paragraph

Das einfache Anführungszeichen wird zu &#039;. 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.

php— editable, runs on the server

Ausgabe:

Caf&eacute; &amp; &laquo;&uuml;ber&raquo;

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 &lt; die Zeichenfolge &amp;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.

php— editable, runs on the server

Mit $double_encode auf false werden die bestehenden Entitäten unverändert durchgereicht:

Hello &lt;strong&gt;World&lt;/strong&gt;!

Hätten Sie $double_encode auf dem Standardwert true belassen, wäre jedes & erneut zu &amp; maskiert worden und das Ergebnis wäre Hello &amp;lt;strong&amp;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_QUOTES und "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().

Übungen

Übung
Was ist die Funktion von 'htmlentities' in PHP?
Was ist die Funktion von 'htmlentities' in PHP?
Was this page helpful?