Start · Sprachen · JavaScript · Referenz · SecurityPolicyViolationEvent.statusCode

SecurityPolicyViolationEvent.statusCode

Eigenschaft

Schreibgeschützte Zahl mit dem HTTP-Statuscode des Dokuments oder Workers, in dem der CSP-Verstoß aufgetreten ist.

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

Signatur

SecurityPolicyViolationEvent.statusCode

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

Typ
number
Beschreibung
Ganzzahliger HTTP-Statuscode (z. B. 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);
Verletzte Direktive: img-src Blockierte URI: https://fremde-domain.example/bild.png HTTP-Status des Dokuments: 200

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);
404 404

// Wichtig · Fallstricke

  • Nicht verwechseln: statusCode ist 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 Wert 0. Das ist kein Fehler.
  • Die Eigenschaft ist schreibgeschützt. Zuweisungen werden im nicht-strikten Modus stillschweigend ignoriert und lösen im Strict Mode einen TypeError aus.
  • Das Event wird nur ausgelöst, wenn eine CSP aktiv ist, egal ob per Header oder per <meta http-equiv=\"Content-Security-Policy\">. Auch Content-Security-Policy-Report-Only löst es aus, dann mit disposition === '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.