Start · Sprachen · JavaScript · Referenz · WorkerGlobalScope.trustedTypes

WorkerGlobalScope.trustedTypes

Eigenschaft

Gibt die <code>TrustedTypePolicyFactory</code> des Worker-Kontexts zurück – der Einstieg in die Trusted Types API innerhalb von Web-, Shared- und Service-Workern.

seit JavaScript Chromium 83+; Firefox und Safari erst in neueren V Kategorie: webapi

Signatur

get WorkerGlobalScope.trustedTypes

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

Typ
TrustedTypePolicyFactory
Beschreibung
Die 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');
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');
}
true false true

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);
}
Blockiert (WorkerGlobalScope importScripts): https://evil.example/x.js TypeError

// 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. Ohne require-trusted-types-for 'script' auf dem Worker-Skript werden reine Zeichenketten weiter angenommen.
  • Richtliniennamen: Mit der CSP-Direktive trusted-types lassen sich erlaubte Namen festlegen. Wird ein Name doppelt vergeben oder ist er nicht erlaubt, wirft createPolicy() einen TypeError, außer 'allow-duplicates' ist gesetzt.
  • Kein Schutz durch bloßes Weiterreichen: Eine Richtlinie wie (s) => s hebelt 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: TrustedScriptURL und Co. lassen sich nicht per postMessage() 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?.createPolicy prü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 eine TrustedScriptURL aus window.trustedTypes.