Signatur
Beschreibung
htmlspecialchars() ist die wichtigste Verteidigungsfunktion gegen Cross-Site-Scripting (XSS). Sie wandelt <, >, &, " und (mit ENT_QUOTES) ' in HTML-Entities um.
Ab PHP 8.1 sind die Standard-Flags ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 — was in fast allen Fällen sicher ist. Trotzdem lohnt es sich, explizit zu sein und immer htmlspecialchars($x, ENT_QUOTES, 'UTF-8') zu schreiben.
In Blade/Twig ist die Funktion bereits im Standard-Escape-Verhalten enthalten. In rohem PHP (Legacy-Code, Custom-Templates) darfst du keine einzige Zeile echo $userInput ohne Escape stehen lassen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | — | Der zu escapende String. |
| $flags | int | ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 | Bitmaske. Nutze ENT_QUOTES, um auch einfache Anführungszeichen zu escapen. |
| $encoding | ?string | null (= ini) | Empfohlen: 'UTF-8'. |
| $double_encode | bool | true | false: bestehende Entities werden nicht nochmal escaped. |
Rückgabewert
Beispiele
User-Input sicher ausgeben
<?php
$comment = '<script>alert(1)</script>';
echo htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');
Kleine Helper-Funktion
<?php
function e(string $s): string {
return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}
echo '<h1>' . e($title) . '</h1>';
// Wichtig · Fallstricke
Nicht ausreichend für: (1) HTML-Attribute ohne Anführungszeichen — nutze immer class="...". (2) JavaScript-Kontext — nutze json_encode. (3) URL-Parameter — nutze rawurlencode.