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

View in English Always switch to English

HTMLScriptElement: textContent-Eigenschaft

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 Eigenschaft repräsentiert den Textinhalt eines Skriptelements, der ausführbar sein kann, abhängig vom Skripttyp. Solche APIs sind bekannt als injection sinks und sind potenziell ein Vektor für Cross-Site Scripting (XSS)-Angriffe.

Sie können dieses Risiko mindern, indem Sie immer TrustedScript-Objekte anstelle von Strings zuweisen und Trusted Types durchsetzen. Siehe Sicherheitsüberlegungen für weitere Informationen.

Die textContent-Eigenschaft des HTMLScriptElement-Interfaces repräsentiert den eingebetteten Textinhalt des <script>-Elements. Sie verhält sich auf die gleiche Weise wie die text und innerText-Eigenschaften.

Wert

Das Abrufen der Eigenschaft gibt einen String zurück, der den Text des Skripts enthält.

Das Setzen der Eigenschaft akzeptiert entweder ein TrustedScript-Objekt oder einen String.

Ausnahmen

TypeError

Wird ausgelöst, wenn die Eigenschaft auf einen String gesetzt wird, während Trusted Types durch eine CSP erzwungen werden und keine Standardrichtlinie definiert ist.

Beschreibung

Die textContent-Eigenschaft des HTMLScriptElement-Interfaces repräsentiert den Textinhalt innerhalb des <script>-Elements.

Für ein ausführbares Skript (das heißt ein Skript, dessen type angibt, dass es sich um ein Modul oder ein klassisches Skript handelt) ist dieser Text eingebetteter ausführbarer Code. Für andere Typen könnte es eine Importkarte, Spekulationsregeln oder eine andere Art von Datenblock darstellen.

Beachten Sie, dass wenn die src-Eigenschaft gesetzt ist, der Inhalt der textContent-Eigenschaft ignoriert wird.

Die textContent-Eigenschaft ist auch auf Node definiert und kann daher mit anderen Knoten (und Elementen) verwendet werden. Wenn sie mit anderen Elementen verwendet wird, erwartet oder erzwingt sie nicht die Zuweisung eines TrustedScript.

Sicherheitsüberlegungen

Die textContent-Eigenschaft — und identische text und innerText Eigenschaften — sind ein möglicher Vektor für Cross-Site Scripting (XSS)-Angriffe, bei denen potenziell unsichere Strings, die von einem Benutzer bereitgestellt werden, ausgeführt werden. Zum Beispiel geht das folgende Beispiel davon aus, dass das scriptElement ein ausführbares <script>-Element ist und dass untrustedCode von einem Benutzer bereitgestellt wurde:

js
const untrustedCode = "alert('Potentially evil code!');";
scriptElement.textContent = untrustedCode; // shows the alert

Sie können diese Probleme mindern, indem Sie immer TrustedScript-Objekte anstelle von Strings zuweisen und Trusted Types durchsetzen unter Verwendung der require-trusted-types-for CSP-Direktive. Dies stellt sicher, dass die Eingabe durch eine Transformationsfunktion geht, die die Möglichkeit hat, den Text zu sanitizen oder abzulehnen, bevor er injiziert wird.

Das Verhalten der Transformationsfunktion hängt vom spezifischen Anwendungsfall ab, der ein benutzerdefiniertes Skript erfordert. Wenn möglich, sollten Sie die erlaubten Skripte genau auf den Code beschränken, dem Sie vertrauen, dass er ausgeführt wird. Wenn das nicht möglich ist, können Sie die Nutzung bestimmter Funktionen im bereitgestellten String erlauben oder blockieren.

Beispiele

Verwendung von TrustedScript

Um das Risiko von XSS zu mindern, sollten wir immer TrustedScript-Instanzen der textContent-Eigenschaft zuweisen.

Trusted Types werden noch nicht von allen Browsern unterstützt, also definieren wir zuerst den trusted types tinyfill. Dies 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 createScript() Methode definiert, um Eingabestrings in TrustedScript-Instanzen zu transformieren. Für den Zweck dieses Beispiels erlauben wir genau das Skript, das wir benötigen.

js
const policy = trustedTypes.createPolicy("inline-script-policy", {
  createScript(input) {
    // Here specify what scripts are safe to allow
    if (input === "const num = 10;\nconsole.log(num)") {
      return input; // allow this exact script
    }
    throw new TypeError(`Untrusted script blocked: ${input}`);
  },
});

Als nächstes erstellen wir das Skriptelement, dem wir den Wert zuweisen werden, und erhalten einen Handle auf das Element.

html
<script id="el"></script>
js
// Get the script element we're injecting the code into
const el = document.getElementById("el");

Dann verwenden wir das policy-Objekt, um ein trustedScript-Objekt aus der potenziell unsicheren Eingabestring zu erstellen, und weisen das Ergebnis dem Element zu:

js
// The potentially malicious string
const untrustedScriptOne = "const num = 10;\nconsole.log(num)";

// Create a TrustedScript instance using the policy
const trustedScript = policy.createScript(untrustedScriptOne);

// Inject the TrustedScript (which contains a trusted string)
el.textContent = trustedScript;

Vergleich von textContent, text und innerText

Dieses Beispiel zeigt, dass das Zuweisen eines Skripts zu jeder der Text-Eigenschaften, wie textContent, dazu führt, dass derselbe Wert aus allen Text-Eigenschaften gelesen wird.

Beachten Sie, dass wir in diesem Fall die Richtlinie nicht verwenden, um vertrauenswürdige Skripte zu erstellen (der Kürze halber nehmen wir an, dass die bereitgestellten Strings vertrauenswürdig sind).

js
// Set the textContent property
el.textContent = "console.log(10);";

console.log(`textContent: ${el.textContent}`);
// "textContent: console.log(10);"

console.log(`text: ${el.text}`);
// "text: console.log(10);"

console.log(`innerText: ${el.innerText}`);
// "innerText: console.log(10);"

// Set the text property
el.text = "const num = 10;\nconsole.log(num)";

console.log(`textContent: ${el.textContent}`);
// textContent: const num = 10; console.log(num)"

console.log(`text: ${el.text}`);
// "text: const num = 10; console.log(num)"

console.log(`innerText: ${el.innerText}`);
// "innerText: const num = 10; console.log(num)"

// Set the innerText property
el.innerText = "const num = 10;alert('Help')";

console.log(`textContent: ${el.textContent}`);
// textContent: const num = 10;alert('Help')"

console.log(`text: ${el.text}`);
// "text: const num = 10;alert('Help')"

console.log(`innerText: ${el.innerText}`);
// "innerText: const num = 10;alert('Help')"

Spezifikationen

Spezifikation
Trusted Types
# dom-htmlscriptelement-textcontent

Browser-Kompatibilität

Siehe auch