Signatur
Beschreibung
createScript() gibt eine Zeichenkette an die Funktion createScript weiter, die beim Anlegen der Richtlinie mit trustedTypes.createPolicy() festgelegt wurde. Diese Funktion prüft den Eingabewert, bereinigt ihn oder lehnt ihn ab. Aus ihrem Rückgabewert wird ein TrustedScript-Objekt gebaut, das der Browser als geprüften JavaScript-Code ansieht.
Gebraucht wird das, sobald eine Content Security Policy mit require-trusted-types-for 'script' aktiv ist. Dann nehmen Skript-Senken wie eval(), new Function(), setTimeout(string), HTMLScriptElement.text, textContent und innerText von <script>-Elementen keine einfachen Zeichenketten mehr an, sondern nur noch TrustedScript-Objekte. Andernfalls wirft der Browser einen TypeError.
Weitere Argumente nach input gibt der Browser unverändert an die Regelfunktion weiter. So lässt sich zum Beispiel Kontext übergeben. Hat die Richtlinie keine createScript-Regel, wirft der Aufruf einen TypeError. Gibt die Regel null oder undefined zurück, entsteht ein TrustedScript mit leerer Zeichenkette.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $input Pflicht | string | Der JavaScript-Quelltext, den die Regelfunktion der Richtlinie prüfen bzw. bereinigen soll. | |
| $...args | any | Weitere Argumente, die unverändert an die createScript-Regelfunktion weitergegeben werden. |
Rückgabewert
TrustedScript-Objekt mit dem von der Regelfunktion zurückgegebenen Code. Seine Zeichenkettenform liefern toString() und toJSON().Beispiele
Richtlinie anlegen und TrustedScript erzeugen
// CSP: require-trusted-types-for 'script'; trusted-types script-policy
const policy = trustedTypes.createPolicy('script-policy', {
createScript: (input) => {
// Nur einfache Konfigurationszuweisungen zulassen
if (!/^window\.appConfig = \{[^<>]*\};$/.test(input)) {
throw new TypeError('Unerlaubtes Skript abgelehnt');
}
return input;
}
});
const trusted = policy.createScript('window.appConfig = {"theme":"dark"};');
console.log(trusted instanceof TrustedScript);
console.log(trusted.toString());
Inline-Skript dynamisch einfügen
const policy = trustedTypes.createPolicy('inline-loader', {
createScript: (code) => code.trim()
});
const script = document.createElement('script');
// Ohne TrustedScript würde das unter erzwungenen Trusted Types einen TypeError werfen
script.textContent = policy.createScript(' console.log("Skript geladen"); ');
document.head.append(script);
Zusätzliche Argumente und Fehlerbehandlung
const policy = trustedTypes.createPolicy('eval-policy', {
createScript: (code, source) => {
if (source !== 'intern') {
throw new TypeError(`Quelle "${source}" nicht vertrauenswürdig`);
}
return code;
}
});
try {
const ok = policy.createScript('2 + 3', 'intern');
console.log(eval(ok));
policy.createScript('alert(1)', 'benutzer');
} catch (err) {
console.error(err.message);
}
Feature-Erkennung mit Rückfall
const scriptPolicy = window.trustedTypes?.createPolicy
? trustedTypes.createPolicy('fallback-safe', { createScript: (s) => s })
: { createScript: (s) => s }; // Browser ohne Trusted Types
const el = document.createElement('script');
el.textContent = scriptPolicy.createScript('console.log("läuft überall")');
document.body.append(el);
// Wichtig · Fallstricke
- Sicherheit: Eine Regel wie
(s) => sgibt die Eingabe ungeprüft weiter und hebelt den Schutz vor XSS komplett aus. Solche Richtlinien nur für Code verwenden, der garantiert nicht von Nutzern oder Dritten stammt. Das Erzeugen sollte an wenigen Stellen gebündelt sein, damit es sich prüfen lässt. - Code zu bereinigen ist praktisch unmöglich. Besser ist es, nur eine feste Liste erlaubter Codes zuzulassen oder auf
eval-artige Senken ganz zu verzichten. - Damit
eval()undnew Function()einTrustedScriptannehmen, muss die CSP zusätzlich'unsafe-eval'oder'trusted-types-eval'inscript-srcerlauben. - Für die URL in
script.srcistcreateScriptURL()zuständig, nichtcreateScript(). - Ohne passende
createScript-Regel wirft der Aufruf einenTypeError. Richtliniennamen müssen in der CSP-Direktivetrusted-typeserlaubt sein. - Kompatibilität: Chromium-Browser unterstützen die API seit Version 83. Firefox und Safari erst seit Kurzem (Firefox 145, Safari 26). Für ältere Browser gibt es ein Polyfill oder eine Feature-Erkennung über
window.trustedTypes.