Element: setHTML() Methode
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.
Die setHTML() Methode der Element-Schnittstelle bietet eine XSS-sichere Methode, um einen HTML-String in ein DocumentFragment zu parsen und zu bereinigen und es dann als Unterbaum des Elements in das DOM einzufügen.
Syntax
setHTML(input)
setHTML(input, options)
Parameter
input-
Ein String, der das zu bereinigende und in das Element einzufügende HTML definiert.
optionsOptional-
Ein Optionsobjekt mit den folgenden optionalen Parametern:
sanitizer-
Ein
SanitizeroderSanitizerConfigObjekt, das definiert, welche Elemente des Eingabe-Strings erlaubt oder entfernt werden, oder der String"default"für die Standardkonfiguration. Beachten Sie, dass in der Regel einSanitizereffizienter ist als eineSanitizerConfig, wenn die Konfiguration wiederverwendet werden soll. Wenn nicht angegeben, wird die Standard-Sanitizer-Konfiguration verwendet.
Rückgabewert
Keiner (undefined).
Ausnahmen
TypeError-
Dies wird ausgelöst, wenn
options.sanitizereinen:- nicht normalisierten
SanitizerConfigübergeben bekommt (eines, das sowohl "erlaubte" als auch "entfernte" Konfigurationseinstellungen enthält). - String bekommt, der nicht den Wert
"default"hat. - Wert bekommt, der weder ein
Sanitizer,SanitizerConfignoch ein String ist.
- nicht normalisierten
Beschreibung
Die setHTML() Methode bietet eine XSS-sichere Methode, um einen HTML-String in ein DocumentFragment zu parsen und zu bereinigen und ihn dann als Unterbaum des Elements in das DOM einzufügen.
setHTML() entfernt alle Elemente im HTML-Input-String, die im Kontext des aktuellen Elements ungültig sind, wie ein <col> Element außerhalb einer <table>.
Anschließend entfernt es alle HTML-Entitäten, die von der Sanitizer-Konfiguration nicht erlaubt sind, und entfernt weiterhin alle XSS-unsicheren Elemente oder Attribute — unabhängig davon, ob sie von der Sanitizer-Konfiguration erlaubt sind oder nicht.
Wird in den options.sanitizer-Parametern keine Sanitizer-Konfiguration angegeben, wird setHTML() mit der Standard-Sanitizer-Konfiguration verwendet.
Diese Konfiguration erlaubt alle Elemente und Attribute, die als XSS-sicher gelten, und verbietet somit Entitäten, die als unsicher gelten.
Ein benutzerdefinierter Sanitizer oder eine benutzerdefinierte Sanitizer-Konfiguration kann angegeben werden, um auszuwählen, welche Elemente, Attribute und Kommentare erlaubt oder entfernt werden.
Beachten Sie, dass selbst wenn unsichere Optionen von der Sanitizer-Konfiguration erlaubt sind, sie bei Verwendung dieser Methode dennoch entfernt werden (die implizit Sanitizer.removeUnsafe() aufruft).
setHTML() sollte anstelle von Element.innerHTML verwendet werden, um untrusted HTML-Strings in ein Element einzufügen.
Es sollte auch anstelle von Element.setHTMLUnsafe() verwendet werden, es sei denn, es besteht ein spezifisches Bedürfnis, unsichere Elemente und Attribute zuzulassen.
Da diese Methode immer Input-Strings unsicherer XSS-Entitäten bereinigt, ist sie nicht durch die Trusted Types API gesichert oder validiert.
Beispiele
>Grundlegende Verwendung
Dieses Beispiel zeigt einige der Möglichkeiten, wie Sie setHTML() verwenden können, um einen HTML-String zu bereinigen und einzufügen.
// Define unsanitized string of HTML
const unsanitizedString = "abc <script>alert(1)<" + "/script> def";
// Get the target Element with id "target"
const target = document.getElementById("target");
// setHTML() with default sanitizer
target.setHTML(unsanitizedString);
// Define custom Sanitizer and use in setHTML()
// This allows only elements: div, p, button (script is unsafe and will be removed)
const sanitizer1 = new Sanitizer({
elements: ["div", "p", "button", "script"],
});
target.setHTML(unsanitizedString, { sanitizer: sanitizer1 });
// Define custom SanitizerConfig within setHTML()
// This removes elements div, p, button, script, and any other unsafe elements/attributes
target.setHTML(unsanitizedString, {
sanitizer: { removeElements: ["div", "p", "button", "script"] },
});
setHTML() Live-Beispiel
Dieses Beispiel bietet eine "Live"-Demonstration der Methode, die mit verschiedenen Sanitizern aufgerufen wird. Der Code definiert Schaltflächen, die Sie klicken können, um einen HTML-String mit einem Standard- und einem benutzerdefinierten Sanitizer zu bereinigen und einzufügen. Der ursprüngliche String und das bereinigte HTML werden protokolliert, damit Sie die Ergebnisse in jedem Fall inspizieren können.
HTML
Das HTML definiert zwei <button> Elemente für die Anwendung verschiedener Sanitizer, einen weiteren Button zur Rücksetzung des Beispiels und ein <div> Element, um den String einzufügen.
<button id="buttonDefault" type="button">Default</button>
<button id="buttonAllowScript" type="button">allowScript</button>
<button id="reload" type="button">Reload</button>
<div id="target">Original content of target element</div>
JavaScript
Zuerst definieren wir den String, der bereinigt werden soll, der in allen Fällen derselbe sein wird.
Dieser enthält das <script> Element und den onclick Handler, die beide als XSS-unsicher gelten.
Wir definieren auch den Handler für die Neuladeschaltfläche.
// Define unsafe string of HTML
const unsanitizedString = `
<div>
<p>This is a paragraph. <button onclick="alert('You clicked the button!')">Click me</button></p>
<script src="path/to/a/module.js" type="module"></script>
</div>
`;
const reload = document.querySelector("#reload");
reload.addEventListener("click", () => document.location.reload());
Als Nächstes definieren wir den Klick-Handler für die Schaltfläche, die das HTML mit dem Standard-Sanitizer setzt.
Dieser sollte alle unsicheren Entitäten entfernen, bevor der HTML-String eingefügt wird.
Beachten Sie, dass Sie genau sehen können, welche Elemente in den Sanitizer() Konstruktor-Beispielen entfernt werden.
const defaultSanitizerButton = document.querySelector("#buttonDefault");
defaultSanitizerButton.addEventListener("click", () => {
// Set the content of the element using the default sanitizer
target.setHTML(unsanitizedString);
// Log HTML before sanitization and after being injected
logElement.textContent =
"Default sanitizer: remove script element and onclick attribute\n\n";
log(`\nunsanitized: ${unsanitizedString}`);
log(`\nsanitized: ${target.innerHTML}`);
});
Der nächste Klick-Handler setzt das Ziel-HTML mit einem benutzerdefinierten Sanitizer, der nur <div>, <p> und <script> Elemente erlaubt.
Beachten Sie, dass, weil wir die setHTML Methode verwenden, <script> auch entfernt wird!
const allowScriptButton = document.querySelector("#buttonAllowScript");
allowScriptButton.addEventListener("click", () => {
// Set the content of the element using a custom sanitizer
const sanitizer1 = new Sanitizer({
elements: ["div", "p", "script"],
});
target.setHTML(unsanitizedString, { sanitizer: sanitizer1 });
// Log HTML before sanitization and after being injected
logElement.textContent =
"Sanitizer: {elements: ['div', 'p', 'script']}\n Script removed even though allowed\n";
log(`\nunsanitized: ${unsanitizedString}`);
log(`\nsanitized: ${target.innerHTML}`);
});
Ergebnisse
Klicken Sie auf die Schaltflächen "Default" und "allowScript", um die Auswirkungen des Standard- und benutzerdefinierten Sanitisers zu sehen.
Beachten Sie, dass in beiden Fällen das <script> Element und der onclick Handler entfernt werden, selbst wenn sie ausdrücklich vom Sanitizer erlaubt sind.
Spezifikationen
| Specification |
|---|
| HTML Sanitizer API> # dom-element-sethtml> |
Browser-Kompatibilität
Loading…