Start · Sprachen · JavaScript · Referenz · WorkerGlobalScope.isSecureContext

WorkerGlobalScope.isSecureContext

Eigenschaft

Schreibgeschützter boolescher Wert, der angibt, ob der Worker in einem sicheren Kontext (z. B. HTTPS) läuft: <code>true</code> oder <code>false</code>.

seit JavaScript Baseline: alle modernen Browser (Chrome 47+, Firef Kategorie: webapi

Signatur

WorkerGlobalScope.isSecureContext

Beschreibung

Die Eigenschaft isSecureContext steht in jedem Worker-Kontext zur Verfügung, also in Dedicated Workers, Shared Workers und Service Workers. Im Worker erreicht man sie direkt als globale Variable oder über self.isSecureContext. Sie ist das Gegenstück zu Window.isSecureContext im Hauptthread.

Ein Kontext gilt als sicher, wenn er über eine vertrauenswürdige Verbindung geladen wurde, also über https: oder wss:, oder wenn er lokal ist (http://localhost, http://127.0.0.1, file:). Bei Workern kommt eine weitere Bedingung hinzu: Auch das Dokument oder der Worker, der ihn erzeugt hat, muss sicher sein. Ein Worker, der von einer unsicheren Seite gestartet wurde, ist deshalb nie sicher.

Viele leistungsfähige APIs gibt es nur in sicheren Kontexten, zum Beispiel crypto.subtle (Web Crypto), navigator.storage, Web-Push, Web Locks oder BroadcastChannel-nahe Speicher-APIs in einigen Browsern. Mit isSecureContext kann der Worker vorab prüfen, ob solche Funktionen verfügbar sind, und sonst auf eine andere Lösung ausweichen oder eine verständliche Fehlermeldung schicken.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn der aktuelle Worker-Kontext sicher ist, sonst false. Der Wert ist schreibgeschützt.

Beispiele

Sicherheitsstatus im Worker prüfen und melden

// worker.js
self.postMessage({
  typ: 'status',
  sicher: self.isSecureContext
});

// main.js
const worker = new Worker('worker.js');
worker.addEventListener('message', ({ data }) => {
  if (data.typ === 'status') {
    console.log(`Worker sicher: ${data.sicher}`);
  }
});
Worker sicher: true // bei Auslieferung über HTTPS oder localhost

Web Crypto nur im sicheren Kontext verwenden

// hash-worker.js
const sha256 = async (text) => {
  if (!self.isSecureContext) {
    throw new Error('crypto.subtle erfordert einen sicheren Kontext (HTTPS).');
  }
  const daten = new TextEncoder().encode(text);
  const hash = await crypto.subtle.digest('SHA-256', daten);
  return [...new Uint8Array(hash)]
    .map((b) => b.toString(16).padStart(2, '0'))
    .join('');
};

self.onmessage = async ({ data }) => {
  try {
    self.postMessage({ ok: true, hash: await sha256(data) });
  } catch (err) {
    self.postMessage({ ok: false, fehler: err.message });
  }
};
{ ok: true, hash: '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824' } // für 'hello'

Service Worker: Speicher nur bei Bedarf dauerhaft anfordern

// sw.js
self.addEventListener('activate', (event) => {
  event.waitUntil((async () => {
    if (self.isSecureContext && navigator.storage?.estimate) {
      const { usage, quota } = await navigator.storage.estimate();
      console.log(`Belegt: ${(usage / 1024).toFixed(1)} KiB von ${(quota / 1024 / 1024).toFixed(0)} MiB`);
    } else {
      console.warn('Storage-API nicht verfügbar (kein sicherer Kontext).');
    }
  })());
});
Belegt: 12.4 KiB von 2048 MiB

// Wichtig · Fallstricke

  • Erbt die Sicherheit vom Erzeuger: Selbst wenn das Worker-Skript über HTTPS geladen wird, liefert die Eigenschaft false, sobald die Seite, die den Worker erzeugt, unsicher ist.
  • Service Workers lassen sich überhaupt nur in sicheren Kontexten registrieren. Dort ist isSecureContext daher praktisch immer true. Nützlich ist die Prüfung vor allem in Dedicated und Shared Workers.
  • Kein Schutz vor Angriffen: Der Wert sagt nur etwas über die Transportsicherheit und die Herkunft des Kontexts aus. Er ersetzt keine Prüfung von Eingaben und keine CSP.
  • Funktionen direkt prüfen: Zusätzlich zu isSecureContext sollte man testen, ob die einzelne API wirklich vorhanden ist, z. B. mit 'subtle' in crypto. Die Verfügbarkeit hängt auch vom Browser ab.
  • Lokale Entwicklung: http://localhost gilt als sicher. Eine lokale IP im Netzwerk (z. B. http://192.168.x.x) gilt dagegen nicht als sicher.
  • Kompatibilität: Wird von allen aktuellen Browsern unterstützt. Sehr alte Browser kennen die Eigenschaft nicht, dann ist der Wert undefined. Prüfe deshalb am besten mit self.isSecureContext === true.