Thanks to visit codestin.com
Credit goes to developer.mozilla.org

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

Warnung: Diese Eigenschaft repräsentiert den Textinhalt eines Skriptelements, das je nach Skripttyp ausführbar sein kann. Solche APIs werden als Injection Sinks bezeichnet und können potenziell ein Vektor für Cross-Site-Scripting (XSS)-Angriffe sein.

Sie können dieses Risiko mindern, indem Sie immer TrustedScript-Objekte anstelle von Zeichenfolgen zuweisen und trusted types erzwingen. Siehe Sicherheitsüberlegungen für weitere Informationen.

Die textContent-Eigenschaft der HTMLScriptElement-Schnittstelle repräsentiert den eingebetteten Textinhalt des <script>-Elements. Sie verhält sich genauso wie die Eigenschaften text und innerText.

Wert

Das Abrufen der Eigenschaft gibt eine Zeichenfolge mit dem Text des Skripts zurück.

Das Setzen der Eigenschaft akzeptiert entweder ein TrustedScript-Objekt oder eine Zeichenfolge.

Ausnahmen

TypeError

Wird geworfen, wenn die Eigenschaft auf eine Zeichenfolge gesetzt wird, während Trusted Types durch eine CSP erzwungen werden und keine Standardrichtlinie definiert ist.

Beschreibung

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

Für ein ausführbares Skript (d.h. 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 kann es eine Importkarte, Spekulationsregeln oder eine andere Art von Datenblock repräsentieren.

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 die identischen text und innerText-Eigenschaften - sind ein möglicher Vektor für Cross-Site-Scripting (XSS)-Angriffe, bei denen potenziell unsichere Zeichenfolgen, die von einem Benutzer bereitgestellt werden, ausgeführt werden. Zum Beispiel geht das folgende Beispiel davon aus, dass 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 Zeichenfolgen zuweisen und trusted types erzwingen unter Verwendung der require-trusted-types-for-CSP-Direktive. Dies stellt sicher, dass die Eingabe durch eine Transformationsfunktion geführt wird, die die Möglichkeit hat, den Text zu sanitizen oder abzulehnen, bevor er eingefügt wird.

Das Verhalten der Transformationsfunktion hängt vom spezifischen Anwendungsfall ab, der ein vom Benutzer bereitgestelltes Skript erfordert. Wenn möglich, sollten Sie die erlaubten Skripte genau auf den Code beschränken, dem Sie vertrauen, um ihn auszuführen. Wenn das nicht möglich ist, könnten Sie die Nutzung bestimmter Funktionen innerhalb der bereitgestellten Zeichenfolge 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, daher definieren wir zuerst die trusted types tinyfill. Dies fungiert als transparente Ersatzlösung 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 Eingabezeichenfolgen 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 zu dem 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 Eingabezeichenfolge zu erstellen und das Ergebnis dem Element zuzuweisen:

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 die Zuweisung eines Skripts zu jeder der Texteigenschaften, wie textContent, dazu führt, dass derselbe Wert von allen Texteigenschaften gelesen wird.

Beachten Sie, dass wir in diesem Fall die Richtlinie nicht verwenden, um vertrauenswürdige Skripte zu erstellen (um der Kürze willen gehen wir davon aus, dass die bereitgestellten Zeichenfolgen 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

Specification
Trusted Types
# dom-htmlscriptelement-textcontent

Browser-Kompatibilität

Siehe auch