Start · Sprachen · JavaScript · Referenz · Sanitizer.get()

Sanitizer.get()

Methode

Gibt die aktuelle Konfiguration eines <code>Sanitizer</code> als normalisiertes <code>SanitizerConfig</code>-Objekt zurück, etwa zum Prüfen, Protokollieren oder Kopieren.

seit JavaScript Experimentell: HTML Sanitizer API (Firefox 148+, i Kategorie: webapi

Signatur

Sanitizer.prototype.get()

Beschreibung

get() liest die Konfiguration aus, die ein Sanitizer-Objekt gerade verwendet. Du bekommst ein neues SanitizerConfig-Objekt mit den Schlüsseln, die zur Konfiguration passen: bei einer Erlaubnisliste elements und attributes, bei einer Sperrliste removeElements und removeAttributes. Dazu können replaceWithChildrenElements, comments und dataAttributes kommen.

Die Angaben kommen in normalisierter Form zurück. Auch wenn du Elemente beim Erstellen nur als Zeichenkette angegeben hast (z. B. "p"), liefert get() Objekte wie { name: "p", namespace: "http://www.w3.org/1999/xhtml" }. Attribute haben in der Regel namespace: null. Elementbezogene Attributlisten stehen bei den jeweiligen Element-Einträgen, also unter attributes oder removeAttributes.

Typische Einsätze sind: die Standardkonfiguration untersuchen (new Sanitizer().get()), die Wirkung von Änderungen wie allowElement() oder removeAttribute() prüfen, Konfigurationen in Tests vergleichen oder einen Sanitizer kopieren (new Sanitizer(original.get())).

Das zurückgegebene Objekt ist eine Kopie. Wenn du es änderst, bleibt der Sanitizer unverändert. Dafür gibt es die Änderungsmethoden des Sanitizer.

Rückgabewert

Typ
SanitizerConfig
Beschreibung
Ein neues Objekt mit der aktuellen, normalisierten Konfiguration. Mögliche Schlüssel: elements/removeElements, attributes/removeAttributes, replaceWithChildrenElements, comments und dataAttributes.

Beispiele

Standardkonfiguration untersuchen

if ('Sanitizer' in window) {
  const sanitizer = new Sanitizer(); // Standardkonfiguration
  const config = sanitizer.get();

  const namen = config.elements.map((el) => el.name);
  console.log('Erlaubt <p>?', namen.includes('p'));
  console.log('Erlaubt <script>?', namen.includes('script'));
} else {
  console.warn('Sanitizer API wird nicht unterstützt.');
}
Erlaubt <p>? true Erlaubt <script>? false

Änderungen an der Konfiguration prüfen

const sanitizer = new Sanitizer({ elements: ['p', 'b'] });
sanitizer.allowElement('i');
sanitizer.removeElement('b');

const namen = sanitizer
  .get()
  .elements.map(({ name }) => name)
  .sort(); // Reihenfolge nicht voraussetzen

console.log(namen);
console.log(sanitizer.get().elements[0].namespace);
["i", "p"] http://www.w3.org/1999/xhtml

Sanitizer kopieren und unabhängig anpassen

const basis = new Sanitizer({ elements: ['p', 'a', 'em'], attributes: ['href'] });

// get() liefert eine Kopie, daraus entsteht ein neuer Sanitizer
const kommentarSanitizer = new Sanitizer(basis.get());
kommentarSanitizer.removeElement('a');

const hat = (s, tag) => s.get().elements.some((el) => el.name === tag);
console.log('Basis erlaubt <a>:', hat(basis, 'a'));
console.log('Kopie erlaubt <a>:', hat(kommentarSanitizer, 'a'));

document.querySelector('#kommentar')
  ?.setHTML('<p>Hallo <a href="https://example.com">Link</a></p>', {
    sanitizer: kommentarSanitizer,
  });
Basis erlaubt <a>: true Kopie erlaubt <a>: false

Konfiguration für Tests oder Protokolle serialisieren

const sanitizer = new Sanitizer({ removeElements: ['iframe', 'object'] });
const snapshot = JSON.stringify(sanitizer.get());

// Ein Ändern des Rückgabewerts wirkt sich nicht auf den Sanitizer aus
const config = sanitizer.get();
config.removeElements = [];
console.log(JSON.stringify(sanitizer.get()) === snapshot);
true

// Wichtig · Fallstricke

  • Experimentelle API: Die HTML Sanitizer API wird noch nicht überall unterstützt, in Chromium-Browsern zum Beispiel nur mit Flag. Prüfe vor der Nutzung mit 'Sanitizer' in window, ob sie verfügbar ist, und plane eine Ausweichlösung wie DOMPurify ein. Ältere Entwürfe hatten stattdessen getConfiguration() und sanitize(), die sich anders verhielten.
  • Normalisierte Form: Vergleiche die Ergebnisse nicht direkt mit deinen Zeichenketten aus dem Konstruktor. Die Einträge sind Objekte mit name und namespace. Verlass dich auch nicht auf eine bestimmte Reihenfolge der Listen.
  • Kopie statt Referenz: Änderungen am Rückgabewert wirken sich nicht auf den Sanitizer aus. Nutze dafür allowElement(), removeElement(), allowAttribute() und die anderen Änderungsmethoden.
  • Sicherheit: get() zeigt nur die Konfiguration. Auch wenn dort unsichere Elemente wie <script> erlaubt sind, entfernt Element.setHTML() sie trotzdem immer. setHTMLUnsafe() dagegen übernimmt die Konfiguration genau so. Wenn du eine Konfiguration von außen übernimmst, entferne vorher mit removeUnsafe() alle unsicheren Einträge.