Signatur
Beschreibung
createHTML() ist der zentrale Baustein, um mit Trusted Types DOM-basiertes XSS zu verhindern. Die Methode ruft die Funktion createHTML auf, die beim Anlegen der Richtlinie über trustedTypes.createPolicy() hinterlegt wurde. Deren Rückgabewert (ein bereinigter String) wird in ein TrustedHTML-Objekt verpackt.
Ist per Content Security Policy require-trusted-types-for 'script' aktiv, akzeptieren sogenannte Injection Sinks wie Element.innerHTML, outerHTML, insertAdjacentHTML(), DOMParser.parseFromString() oder document.write() keine normalen Strings mehr, sondern nur noch TrustedHTML. So wird jede HTML-Zuweisung zwangsläufig über eine geprüfte, zentral auditierbare Richtlinie geführt.
Verwenden Sie createHTML() immer dann, wenn Sie HTML aus nicht vertrauenswürdigen Quellen (Benutzereingaben, API-Antworten, URL-Parameter) ins DOM einfügen müssen. Die eigentliche Sicherheit hängt vollständig von der Bereinigungsfunktion ab – typischerweise ein Sanitizer wie DOMPurify oder ein striktes Escaping.
Zusätzliche Argumente nach input werden unverändert an die Richtlinienfunktion weitergereicht; damit lassen sich z. B. Kontextinformationen oder Optionen übergeben.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $input Pflicht | string | Der HTML-String, der von der Richtlinie geprüft bzw. bereinigt werden soll. Andere Werte werden in einen String umgewandelt. | |
| $...args | any[] | Beliebige weitere Argumente, die an die createHTML-Funktion der Richtlinie weitergegeben werden. |
Rückgabewert
TrustedHTML-Objekt, dessen toString() den von der Richtlinie gelieferten String zurückgibt. Liefert die Richtlinienfunktion null oder undefined, entsteht ein TrustedHTML mit leerem String.Beispiele
Einfache Escape-Richtlinie
// Maskiert alle spitzen Klammern – ausführbares Markup bleibt als Text sichtbar
const escapePolicy = trustedTypes.createPolicy('escape-html', {
createHTML: (input) => input.replace(/</g, '<').replace(/>/g, '>')
});
const userInput = '<img src=x onerror="alert(1)">';
const safe = escapePolicy.createHTML(userInput);
console.log(safe instanceof TrustedHTML);
console.log(safe.toString());
document.querySelector('#ausgabe').innerHTML = safe;
Bereinigung mit DOMPurify vor innerHTML
import DOMPurify from 'dompurify';
const sanitizerPolicy = trustedTypes.createPolicy('dompurify', {
createHTML: (dirty) => DOMPurify.sanitize(dirty)
});
const renderKommentar = async (id) => {
const res = await fetch(`/api/kommentare/${id}`);
const { html } = await res.json();
// Nur TrustedHTML wird bei aktiver CSP akzeptiert
document.querySelector('#kommentar').innerHTML = sanitizerPolicy.createHTML(html);
};
renderKommentar(42);
Zusätzliche Argumente und Feature-Erkennung
// Fallback für Browser ohne Trusted Types
const policy = window.trustedTypes?.createPolicy('kontext', {
createHTML: (input, erlaubteTags = []) => {
const tags = erlaubteTags.join('|');
const re = new RegExp(`<(?!\/?(${tags})>)[^>]*>`, 'gi');
return input.replace(re, '');
}
}) ?? { createHTML: (s) => s };
const html = policy.createHTML('<b>fett</b><script>x()</script><i>kursiv</i>', ['b', 'i']);
console.log(html.toString());
// Wichtig · Fallstricke
- Sicherheit hängt an der Richtlinie: Eine Richtlinie wie
createHTML: s => shebelt den Schutz komplett aus. Selbstgebaute Regex-Filter (wie im dritten Beispiel) sind nur zur Demonstration geeignet – nutzen Sie für echte Bereinigung einen bewährten Sanitizer. - Fehlende Funktion: Wurde die Richtlinie ohne
createHTMLangelegt, wirft der Aufruf einenTypeError. - CSP: Ohne
require-trusted-types-for 'script'werden Strings weiterhin akzeptiert – Trusted Types wirken dann nur freiwillig. Mit der Direktivetrusted-typeslässt sich festlegen, welche Richtliniennamen überhaupt erstellt werden dürfen; unbekannte Namen führen beicreatePolicy()zu einem Fehler. - Browser-Kompatibilität: Vollständig unterstützt in Chromium-Browsern (Chrome, Edge, Opera) ab Version 83; Firefox und Safari ziehen erst nach. Mit
window.trustedTypes?.createPolicyerkennen und bei Bedarf Polyfill (trusted-typesvon W3C) einsetzen. - Ein
TrustedHTML-Objekt ist nicht an eine bestimmte Senke gebunden, darf aber nur für HTML-Senken verwendet werden – für Skripte bzw. Skript-URLs gibt escreateScript()undcreateScriptURL().