Signatur
Beschreibung
Die Eigenschaft statusCode gehört zum Dictionary CSPViolationReport. Dieses steckt im Feld body eines Report-Objekts vom Typ "csp-violation". Sie enthält den HTTP-Statuscode der Antwort, mit der das Dokument (Fenster) oder der Worker ausgeliefert wurde, dessen Content Security Policy verletzt wurde. Der Wert ist z. B. 200, 404 oder 500.
Nützlich ist das vor allem beim Auswerten von CSP-Berichten: Du kannst Verletzungen auf regulären Seiten (200) von solchen auf Fehlerseiten (404, 500) unterscheiden. Fehlerseiten nutzen oft eigene Vorlagen, Tracking-Skripte oder Inline-Styles und verursachen deshalb viele Berichte, die mit der eigentlichen Anwendung nichts zu tun haben. So kannst du solche Berichte filtern oder gezielt beheben.
Auf die Berichte kommst du auf zwei Wegen: im Browser über einen ReportingObserver mit types: ["csp-violation"] oder auf dem Server über einen Endpunkt, den der Header Reporting-Endpoints zusammen mit der CSP-Direktive report-to festlegt. Im zweiten Fall schickt der Browser die Berichte als JSON (application/reports+json), und statusCode steht unter body.statusCode.
Rückgabewert
200). Bei Dokumenten, die nicht über HTTP geladen wurden (z. B. about:blank, data:-URLs), ist der Wert 0.Beispiele
CSP-Verletzungen im Browser mit ReportingObserver beobachten
// Beobachtet CSP-Verletzungen des aktuellen Dokuments
const observer = new ReportingObserver((reports) => {
for (const report of reports) {
const { statusCode, effectiveDirective, blockedURL } = report.body;
console.log(`Status ${statusCode}: ${effectiveDirective} blockiert ${blockedURL}`);
}
}, { types: ["csp-violation"], buffered: true });
observer.observe();
// Verletzung provozieren (bei CSP "img-src 'self'")
const img = new Image();
img.src = "https://tracker.example.com/pixel.gif";
Berichte von Fehlerseiten auf dem Server herausfiltern (Node.js/Express)
import express from "express";
const app = express();
// CSP und Endpunkt für Berichte festlegen
app.use((req, res, next) => {
res.set("Reporting-Endpoints", 'csp-endpoint="/csp-reports"');
res.set("Content-Security-Policy", "script-src 'self'; report-to csp-endpoint");
next();
});
app.post("/csp-reports", express.json({ type: "application/reports+json" }), (req, res) => {
const reports = Array.isArray(req.body) ? req.body : [];
for (const { type, body } of reports) {
if (type !== "csp-violation") continue;
// Verletzungen auf Fehlerseiten getrennt protokollieren
if (body.statusCode >= 400) {
console.warn(`[Fehlerseite ${body.statusCode}] ${body.documentURL}`);
} else {
console.log(`[CSP] ${body.effectiveDirective} -> ${body.blockedURL}`);
}
}
res.sendStatus(204);
});
app.listen(3000);
Berichte nach Statuscode gruppieren
const counts = new Map();
const observer = new ReportingObserver((reports) => {
for (const { body } of reports) {
counts.set(body.statusCode, (counts.get(body.statusCode) ?? 0) + 1);
}
console.log(Object.fromEntries(counts));
}, { types: ["csp-violation"] });
observer.observe();
// Wichtig · Fallstricke
- Nicht der Status der blockierten Ressource:
statusCodegehört zum Dokument bzw. Worker, in dem die Richtlinie gilt, und nicht zum blockierten Skript oder Bild. Blockierte Ressourcen werden gar nicht erst geladen und haben deshalb keinen Statuscode. - Wert
0: Tritt bei Dokumenten auf, die nicht über HTTP(S) geladen wurden, z. B.about:blank-iframes,data:- oderblob:-Inhalte. Diese Fälle solltest du bei der Auswertung berücksichtigen. - Altes Berichtsformat: Die veraltete Direktive
report-urischickt Berichte alsapplication/csp-report, und dort heißt das Feld"status-code"(mit Bindestrich) unter"csp-report". Nur die Reporting API (report-to) verwendetbody.statusCode. Wenn du beide Formate empfangen willst, muss dein Server beide Schreibweisen verarbeiten. - Browser-Kompatibilität:
ReportingObserverundreport-towerden in Chromium-basierten Browsern vollständig unterstützt, in Firefox und Safari aber nur teilweise oder erst in neueren Versionen. Prüfe vorher mit"ReportingObserver" in globalThis. Als Alternative bietet sich das Ereignissecuritypolicyviolationan, das ebenfalls einestatusCode-Eigenschaft hat. - Datenschutz: Berichte können URLs mit Abfrageparametern enthalten. Speichere sie auf dem Server daher nur gekürzt oder anonymisiert.