Signatur
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
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}`);
}
});
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 });
}
};
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).');
}
})());
});
// 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
isSecureContextdaher praktisch immertrue. 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
isSecureContextsollte 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://localhostgilt 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 mitself.isSecureContext === true.