Änderung der HTML-Spezifikation: Entkommentierung von < und > in Attributen

Michał Bentkowski
Michał Bentkowski

Veröffentlicht: 12. Juni 2025

Am 20. Mai 2025 wurde die HTML-Spezifikation aktualisiert, um < und > in Attributen zu entkommenttieren und so Mutation XSS-Sicherheitslücken (mXSS) zu vermeiden. Diese Änderung wurde in Chrome 138 implementiert, das am 28. Mai 2025 zur Betaversion wurde und am 24. Juni 2025 zur stabilen Version wird.

In diesem Beitrag werden die Auswirkungen der Änderung des HTML-Attributs auf Webentwickler und mögliche Fehler beschrieben. Die Sicherheitsgründe für diese Änderung werden in unserem zugehörigen Beitrag im Security Engineering-Blog erläutert.

Was hat sich geändert?

Angenommen, Sie haben ein <div>-Element, dessen Attribut data-content den Wert "<u>hello</u>" hat. Was passiert, wenn ich div.outerHTML lese?

Bisher wurde folgende HTML-Ausgabe zurückgegeben:

<div data-content="<u>hello</u>"></div>

Nach der Änderung wird die folgende HTML-Datei angezeigt:

<div data-content="&lt;u&gt;hello&lt;/u&gt;"></div>

Bisher wurden weder < noch > in Attributen entkommentiert. Beide Zeichen werden jetzt immer maskiert.

Was sich nicht geändert hat

Durch die Änderung wird ausschließlich geändert, wie HTML-Fragmente bei der Serialisierung wieder in eine Stringdarstellung umgewandelt werden. Die Auswirkungen sind auf Szenarien beschränkt, in denen auf die Properties innerHTML oder outerHTML zugegriffen wird oder die Methode getHTML() auf ein Element angewendet wird. Bei diesen Vorgängen wird die vorhandene DOM-Struktur verwendet, um eine textbasierte HTML-Darstellung zu erstellen.

Diese Änderung hat keine Auswirkungen auf das HTML-Parsen. Betrachten Sie das folgende HTML-Snippet:

<div id="div1" data-content="<u>hello</u>"></div>
<div id="div2" data-content="&lt;u&gt;hello&lt;/u&gt;"></div>

Beide divs werden genau gleich analysiert und in beiden Fällen gibt div.dataset.content "<u>hello</u>" zurück.

Was geht nicht kaputt?

Wenn Sie eine DOM-API wie getAttribute, getAttributeNS, dataset oder attributes verwenden, um Attributwerte abzurufen, werden dieselben decodierten Werte wie zuvor zurückgegeben, insbesondere mit decodierten < und >.

Im folgenden Beispiel wird für alle console.log-Zeilen "<u>" protokolliert:

<div data-content="&lt;u&gt;"></div>
const div = document.querySelector("div");
// All of the following will log "<u>"
console.log(div.getAttribute("data-content"));
console.log(div.dataset.content);
console.log(div.attributes['data-content'].value);

Was kann kaputtgehen?

innerHTML und outerHTML zum Abrufen von Attributen

Wenn Sie innerHTML oder outerHTML verwenden, um den Wert eines Attributs zu extrahieren, kann Ihr Code beschädigt werden. Betrachten Sie das folgende, etwas komplizierte Beispiel:

<div data-content="<u>"></div>
const div = document.querySelector("div");
const content = div.outerHTML.match(/"([^"]+)"/)[1];
console.log(content);

Dieser Code verhält sich nach dieser Änderung anders. Bisher war content gleich "<u>", jetzt ist es "&lt;u&gt;".

Das Parsen von HTML mit regulären Ausdrücken wird nicht empfohlen. Wenn Sie den Wert eines Attributs abrufen möchten, verwenden Sie die in den vorherigen Abschnitten beschriebenen DOM APIs.

End-to-End-Tests

Wenn Sie eine CI/CD-Pipeline haben, in der Sie Chromium zum Generieren von HTML verwenden, und Sie Tests geschrieben haben, um das HTML mit einem statischen erwarteten Wert zu vergleichen, können diese Tests fehlschlagen, wenn ein Attribut < oder > enthält.

Das ist eine erwartete Unterbrechung. Sie müssen den erwarteten Wert so aktualisieren, dass alle <- und >-Zeichen in &lt; bzw. &gt;, umgewandelt werden.

Zusammenfassung

In diesem Blogpost wird eine Änderung an der HTML-Spezifikation beschrieben, die dazu führt, dass Browser < und > in Attributen ausgeben, um die Sicherheit zu verbessern, indem einige Fälle von Mutation-XSS verhindert werden.

Die Änderung ist ab dem 24. Juni 2025 für alle Nutzer in Chromium (Version 138) und Firefox (Version 140) verfügbar. Sie ist auch in Safari 26 Beta enthalten, das voraussichtlich im September 2025 veröffentlicht wird.

Wenn Sie der Meinung sind, dass diese Änderung Ihre Website beschädigt hat und Sie sie nicht einfach beheben können, senden Sie bitte einen Fehlerbericht unter https://issues.chromium.org/.

Weitere Informationen