Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

DOMParser: Methode parseFromString()

Baseline
Weitgehend verfügbar
*

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.

* Einige Teile dieser Funktion werden möglicherweise unterschiedlich gut unterstützt.

Warnung: Diese Methode parst ihre Eingabe als HTML und schreibt das Ergebnis in das DOM. APIs wie diese werden als Injection Sinks bezeichnet und können für Cross-Site-Scripting-Angriffe (XSS) ausgenutzt werden, wenn die Eingabe ursprünglich von einem Angreifer stammt.

Sie können dieses Risiko verringern, indem Sie statt Strings stets TrustedHTML-Objekte übergeben und Trusted Types erzwingen. Weitere Informationen finden Sie unter Sicherheitsaspekte.

Die Methode parseFromString() des Interfaces DOMParser parst eine Eingabe, die entweder HTML oder XML enthält, und gibt ein Document zurück, dessen Typ in der Eigenschaft contentType angegeben ist.

Hinweis: Die statische Methode Document.parseHTMLUnsafe() bietet eine komfortable Alternative, um HTML-Markup in ein Document zu parsen.

Syntax

js
parseFromString(input, mimeType)

Parameter

input

Eine TrustedHTML-Instanz oder ein String, der das zu parsende HTML definiert. Das Markup muss ein HTML-, XML-, XHTML- oder SVG-Dokument enthalten.

mimeType

Ein String, der angibt, ob der XML-Parser oder der HTML-Parser zum Parsen des Strings verwendet wird.

Zulässige Werte sind:

  • text/html
  • text/xml
  • application/xml
  • application/xhtml+xml
  • image/svg+xml

Rückgabewert

Ein Document, dessen contentType dem angegebenen mimeType entspricht.

Hinweis: Der Browser kann tatsächlich ein HTMLDocument- oder XMLDocument-Objekt zurückgeben. Diese leiten sich von Document ab und fügen keine Attribute hinzu; sie sind im Wesentlichen gleichwertig.

Ausnahmen

TypeError

Wird in folgenden Fällen ausgelöst:

Beschreibung

Die Methode parseFromString() parst eine Eingabe, die entweder HTML oder XML enthält, und gibt ein Document zurück, dessen contentType dem mimeType entspricht. Dieses Document enthält ein vollständiges DOM im Arbeitsspeicher, das vom Hauptdokument der zugehörigen Seite getrennt ist.

Wenn mimeType den Wert text/html hat, wird die Eingabe als HTML geparst. <script>-Elemente werden als nicht ausführbar markiert, Events werden nicht ausgelöst und Event-Handler werden nicht aufgerufen, um Inline-Skripte auszuführen. Das Dokument kann zwar Ressourcen herunterladen, die in <iframe>- und <img>-Elementen angegeben sind, ist aber im Wesentlichen inaktiv. Das ist nützlich, weil Sie HTML-Eingaben mit deklarativen Shadow Roots parsen und Operationen am Dokument ausführen können, ohne die sichtbare Seite zu beeinflussen. Sie können beispielsweise den Eingabebaum bereinigen und bei Bedarf Teile der Eingabe in das sichtbare DOM einfügen.

Bei den anderen zulässigen Werten (text/xml, application/xml, application/xhtml+xml und image/svg+xml) wird die Eingabe als XML geparst. Das ist nützlich, wenn Sie XML-Dateien importieren, ihre Struktur validieren und Daten daraus extrahieren möchten. Wenn die Eingabe kein wohlgeformtes XML darstellt, enthält das zurückgegebene Dokument einen <parsererror>-Knoten, der den Parse-Fehler beschreibt.

Unzulässige mimeType-Werte führen dazu, dass ein TypeError ausgelöst wird.

Sicherheitsaspekte

Diese Methode parst ihre Eingabe in ein separates DOM im Arbeitsspeicher. Dabei deaktiviert sie alle <script>-Elemente und verhindert die Ausführung von Event-Handlern. Obwohl das zurückgegebene Dokument praktisch inaktiv ist, können Event-Handler und Skripte in seinem DOM ausgeführt werden, wenn sie in das sichtbare DOM eingefügt werden. Die Methode kann daher für Cross-Site-Scripting-Angriffe (XSS) ausgenutzt werden: Potenziell unsichere Eingaben werden zunächst ohne Bereinigung in ein Document geparst und anschließend in das sichtbare, aktive DOM eingefügt, wo Code ausgeführt werden kann.

Sie sollten dieses Risiko verringern, indem Sie statt Strings stets TrustedHTML-Objekte übergeben und Trusted Types mit der CSP-Direktive require-trusted-types-for erzwingen. Dadurch wird sichergestellt, dass die Eingabe eine Transformationsfunktion durchläuft, die sie vor dem Einfügen bereinigen und potenziell gefährliches Markup wie <script>-Elemente und Event-Handler-Attribute entfernen kann.

Durch die Verwendung von TrustedHTML können Sie den Bereinigungscode an wenigen Stellen prüfen und seine Wirksamkeit kontrollieren, statt ihn über alle Ihre Injection Sinks verteilt vorzufinden. Wenn Sie TrustedHTML verwenden, sollten Sie der Methode keinen Sanitizer übergeben müssen.

Beachten Sie, dass Sie beim Umgang mit Benutzereingaben weiterhin vorsichtig sein müssen, selbst wenn Sie Elemente und Attribute entfernen, die Code ausführen können. Beispielsweise könnte Ihre Seite Daten aus einem XML-Dokument verwenden, um Dateien abzurufen, die sie anschließend ausführt.

Beispiele

Eine Eingabe mit Trusted Types parsen

In diesem Beispiel parsen wir eine potenziell schädliche HTML-Eingabe auf sichere Weise und fügen sie anschließend in das DOM der sichtbaren Seite ein.

Um das XSS-Risiko zu verringern, erstellen wir aus dem String mit dem HTML ein TrustedHTML-Objekt. Trusted Types werden noch nicht von allen Browsern unterstützt. Deshalb definieren wir zunächst den Trusted Types Tinyfill. Dieser dient als transparenter Ersatz für die Trusted Types JavaScript API:

js
if (typeof trustedTypes === "undefined")
  trustedTypes = { createPolicy: (n, rules) => rules };

Als Nächstes erstellen wir eine TrustedTypePolicy, die eine createHTML()-Funktion zur Umwandlung eines Eingabe-Strings in TrustedHTML-Instanzen definiert. Implementierungen von createHTML() verwenden üblicherweise eine Bibliothek wie DOMPurify, um die Eingabe zu bereinigen, wie unten gezeigt:

js
const policy = trustedTypes.createPolicy("my-policy", {
  createHTML: (input) => DOMPurify.sanitize(input),
});

Anschließend verwenden wir dieses policy-Objekt, um aus dem potenziell unsicheren Eingabe-String ein TrustedHTML-Objekt zu erstellen und es in ein Document zu parsen. Beachten Sie, dass das resultierende Document ein vollständiges HTML-Dokument mit den Elementen <html>, <head> und <body> darstellt, obwohl die Eingabe diese Elemente nicht enthält:

js
// The potentially malicious string
const untrustedString = "<p>I might be XSS</p><img src='x' onerror='alert(1)'>";

// Create a TrustedHTML instance using the policy
const trustedHTML = policy.createHTML(untrustedString);

// Parse the TrustedHTML (which contains a trusted string)
const safeDocument = parser.parseFromString(trustedHTML, "text/html");

safeDocument enthält nun ein DOM, aus dem schädliche Elemente gemäß unserer Richtlinie entfernt wurden. Im Folgenden verwenden wir Element.replaceWith(), um den body des sichtbaren DOM durch den body unseres Dokuments zu ersetzen. Skripte im neuen body werden ebenso ausgeführt wie Code, wenn Event-Handler ausgelöst werden.

js
document.body.replaceWith(safeDocument.body);

XML, SVG und HTML parsen

Der folgende Code zeigt, wie Sie mit der Methode die einzelnen Inhaltstypen parsen. In produktivem Code sollten Sie Trusted Types verwenden; hier werden sie der Kürze halber weggelassen.

js
const parser = new DOMParser();

const xmlString = "<warning>Beware of the tiger</warning>";
const doc1 = parser.parseFromString(xmlString, "application/xml");
console.log(doc1.contentType); // "application/xml"

const svgString = '<circle cx="50" cy="50" r="50"/>';
const doc2 = parser.parseFromString(svgString, "image/svg+xml");
console.log(doc2.contentType); // "image/svg+xml"

const htmlString = "<strong>Beware of the leopard</strong>";
const doc3 = parser.parseFromString(htmlString, "text/html");
console.log(doc3.contentType); // "text/html"

console.log(doc1.documentElement.textContent);
// "Beware of the tiger"

console.log(doc2.firstChild.tagName);
// "circle"

console.log(doc3.body.firstChild.textContent);
// "Beware of the leopard"

Beachten Sie, dass die MIME-Typen application/xml und image/svg+xml oben funktional identisch sind – letzterer enthält keine SVG-spezifischen Parsing-Regeln.

Fehlerbehandlung

Wenn der XML-Parser mit einem String verwendet wird, der kein wohlgeformtes XML darstellt, enthält das von parseFromString zurückgegebene XMLDocument einen <parsererror>-Knoten, der den Parse-Fehler beschreibt.

js
const parser = new DOMParser();

const xmlString = "<warning>Beware of the missing closing tag";
const doc = parser.parseFromString(xmlString, "application/xml");
const errorNode = doc.querySelector("parsererror");
if (errorNode) {
  // parsing failed
} else {
  // parsing succeeded
}

Zusätzlich kann der Parse-Fehler in der JavaScript-Konsole des Browsers gemeldet werden.

Spezifikationen

Spezifikation
HTML
# dom-domparser-parsefromstring-dev

Browser-Kompatibilität

Siehe auch