Signatur
Beschreibung
Die schreibgeschützte Eigenschaft statusCode eines SecurityPolicyViolationEvent enthält den HTTP-Statuscode der Ressource, deren Content Security Policy verletzt wurde. Das ist in der Regel das Dokument (Window) oder der Worker, der die Richtlinie ausliefert. Den Statuscode der blockierten Ressource liefert sie nicht.
Nützlich ist der Wert beim Auswerten von CSP-Verstößen im Client, etwa wenn man eigene Berichte an ein Monitoring-Backend schickt. Damit lässt sich unterscheiden, ob ein Verstoß auf einer normalen Seite (200), einer Fehlerseite (404, 500) oder einer anderen Antwort passiert ist. Fehlerseiten laden oft andere Skripte oder Styles und fallen deshalb bei CSP-Verstößen häufiger auf.
Wurde das Dokument nicht über HTTP geladen (z. B. about:blank, data:-URLs oder lokale Dateien), ist der Wert 0. Im serverseitigen CSP-Bericht (report-uri/report-to) steht dieselbe Information im Feld status-code bzw. statusCode.
Rückgabewert
200, 404) des Dokuments oder Workers, in dem der Verstoß aufgetreten ist. 0, wenn kein HTTP-Status vorliegt.Beispiele
Statuscode bei einem CSP-Verstoß ausgeben
document.addEventListener('securitypolicyviolation', (event) => {
console.log('Verletzte Direktive:', event.violatedDirective);
console.log('Blockierte URI:', event.blockedURI);
console.log('HTTP-Status des Dokuments:', event.statusCode);
});
// Verstoß provozieren (bei CSP "img-src 'self'")
const img = new Image();
img.src = 'https://fremde-domain.example/bild.png';
document.body.append(img);
Verstöße mit Statuscode an ein Monitoring-Backend senden
const reportViolation = (event) => {
const payload = {
page: event.documentURI,
status: event.statusCode,
directive: event.effectiveDirective,
blocked: event.blockedURI,
source: `${event.sourceFile}:${event.lineNumber}`,
isErrorPage: event.statusCode >= 400
};
// sendBeacon übersteht auch das Entladen der Seite
navigator.sendBeacon('/api/csp-monitor', JSON.stringify(payload));
};
document.addEventListener('securitypolicyviolation', reportViolation);
Synthetisches Event mit eigenem Statuscode erzeugen (z. B. für Tests)
const testEvent = new SecurityPolicyViolationEvent('securitypolicyviolation', {
documentURI: 'https://example.com/nicht-gefunden',
violatedDirective: 'script-src',
effectiveDirective: 'script-src',
originalPolicy: "script-src 'self'",
disposition: 'enforce',
statusCode: 404
});
console.log(testEvent.statusCode);
// Nachträgliches Setzen hat keine Wirkung
testEvent.statusCode = 500;
console.log(testEvent.statusCode);
// Wichtig · Fallstricke
- Nicht verwechseln:
statusCodeist der Status des Dokuments bzw. Workers mit der Richtlinie, nicht der Status der blockierten Ressource. Blockierte Ressourcen werden gar nicht erst geladen und haben deshalb keinen Statuscode. - Ohne HTTP-Antwort (z. B.
about:blank,data:,file:) ist der Wert0. Das ist kein Fehler. - Die Eigenschaft ist schreibgeschützt. Zuweisungen werden im nicht-strikten Modus stillschweigend ignoriert und lösen im Strict Mode einen
TypeErroraus. - Das Event wird nur ausgelöst, wenn eine CSP aktiv ist, egal ob per Header oder per
<meta http-equiv=\"Content-Security-Policy\">. AuchContent-Security-Policy-Report-Onlylöst es aus, dann mitdisposition === 'report'. - Kompatibilität: Alle aktuellen Browser unterstützen die Eigenschaft. Ältere Firefox-Versionen vor 63 kennen das Event nicht.
- Datenschutz: Clientseitig gesammelte Berichte können URLs mit sensiblen Abfrageparametern enthalten. Diese sollte man vor dem Versand bereinigen.