Start · Sprachen · JavaScript · Referenz · Sanitizer

Sanitizer

Schnittstelle

Konfigurationsobjekt der HTML Sanitizer API. Es legt fest, welche Elemente, Attribute und Kommentare beim Einfügen von HTML-Strings erhalten bleiben oder entfernt werden.

seit JavaScript Experimentell: Firefox 148+; Chromium hinter Flag. Kategorie: webapi

Signatur

interface Sanitizer

Beschreibung

Das Interface Sanitizer gehört zur HTML Sanitizer API. Ein Sanitizer bereinigt HTML nicht selbst. Er ist eine wiederverwendbare Konfiguration, die Sie an Methoden wie Element.setHTML(), ShadowRoot.setHTML(), Document.parseHTML() oder deren „Unsafe“-Varianten übergeben. Die Konfiguration bestimmt, welche Elemente und Attribute erlaubt sind, welche entfernt werden und welche Elemente durch ihren Inhalt ersetzt werden. Außerdem legt sie fest, ob Kommentare und data-*-Attribute erhalten bleiben.

Sie erzeugen eine Instanz mit new Sanitizer(). Ohne Argument oder mit "default" erhalten Sie die eingebaute, sichere Standardkonfiguration. Alternativ übergeben Sie ein SanitizerConfig-Objekt. Danach können Sie die Konfiguration mit Methoden wie allowElement(), removeElement(), replaceElementWithChildren(), allowAttribute(), removeAttribute(), setComments(), setDataAttributes() und removeUnsafe() anpassen. get() gibt die aktuelle Konfiguration als normales Objekt zurück.

Der Sanitizer eignet sich überall, wo Sie HTML aus nicht vertrauenswürdigen Quellen anzeigen: Kommentare von Nutzern, Markdown-Vorschauen, WYSIWYG-Editoren oder HTML-Fragmente aus Drittanbieter-APIs. Die Bereinigung verwendet den HTML-Parser des Browsers selbst. Dadurch fallen Probleme weg, die entstehen, wenn Bibliothek und Browser HTML unterschiedlich parsen (Stichwort mXSS, „mutation XSS“).

Wichtig: Die sicheren Methoden (setHTML(), parseHTML()) entfernen immer XSS-gefährliche Inhalte wie <script> oder on*-Event-Handler, egal wie der Sanitizer konfiguriert ist. Die Methoden setHTMLUnsafe() und Document.parseHTMLUnsafe() wenden dagegen nur Ihre Konfiguration an. Dort müssen Sie für Sicherheit selbst sorgen, zum Beispiel mit removeUnsafe().

Parameter

Name Typ Default Beschreibung
$configuration SanitizerConfig | "default" "default" Konfiguration für den Konstruktor. Entweder "default" für die sichere Standardkonfiguration oder ein Objekt mit den Schlüsseln elements, removeElements, replaceWithChildrenElements, attributes, removeAttributes, comments (boolean) und dataAttributes (boolean). Innerhalb eines Objekts sollten Sie entweder mit Erlaubnislisten (elements/attributes) oder mit Sperrlisten (removeElements/removeAttributes) arbeiten, nicht mit beidem.

Rückgabewert

Typ
Sanitizer
Beschreibung
Eine neue Sanitizer-Instanz. Sie übergeben sie als Option { sanitizer } an setHTML(), setHTMLUnsafe(), parseHTML() oder parseHTMLUnsafe(). Ist die Konfiguration ungültig, zum Beispiel widersprüchlich, wirft der Konstruktor einen TypeError.

Beispiele

Nutzer-HTML mit Standard-Sanitizer einfügen

const kommentar = '<p>Hallo <b>Welt</b></p><img src=x onerror="alert(1)"><script>alert(2)</script>';
const ziel = document.querySelector('#kommentar');

// setHTML() bereinigt immer sicher, auch ohne eigenen Sanitizer
ziel.setHTML(kommentar);

console.log(ziel.innerHTML);
<p>Hallo <b>Welt</b></p><img src="x">

Eigene Erlaubnisliste per Konstruktor

// Nur einfache Textformatierung und Links erlauben
const sanitizer = new Sanitizer({
  elements: ['p', 'b', 'i', 'em', 'strong', 'a', 'br'],
  attributes: ['href', 'title'],
  comments: false
});

const html = '<h1>Titel</h1><p class="x">Siehe <a href="https://example.com" target="_blank">Link</a><!-- Notiz --></p>';
const box = document.querySelector('#vorschau');
box.setHTML(html, { sanitizer });

console.log(box.innerHTML);
<p>Siehe <a href="https://example.com">Link</a></p>

Konfiguration mit Methoden anpassen und auslesen

const sanitizer = new Sanitizer(); // Standardkonfiguration

sanitizer.removeElement('img');                 // Bilder komplett entfernen
sanitizer.replaceElementWithChildren('span');   // <span> auflösen, Inhalt behalten
sanitizer.setDataAttributes(false);             // keine data-*-Attribute
sanitizer.setComments(false);

const el = document.createElement('div');
el.setHTML('<span data-id="1">Text</span><img src="a.png">', { sanitizer });
console.log(el.innerHTML);

// Aktuelle Konfiguration als normales Objekt
const config = sanitizer.get();
console.log(config.comments, config.dataAttributes);
Text false false

Feature-Erkennung mit Fallback

const renderSicher = (element, html) => {
  if ('Sanitizer' in window && 'setHTML' in Element.prototype) {
    element.setHTML(html, { sanitizer: new Sanitizer() });
  } else {
    // Fallback: nur Text einfügen (oder z. B. DOMPurify verwenden)
    element.textContent = html;
  }
};

renderSicher(document.querySelector('#ausgabe'), '<em>Hi</em><script>boom()</script>');