Signatur
Beschreibung
sourceFile ist eine schreibgeschützte Eigenschaft des Dictionaries CSPViolationReport. Dieses Objekt steckt im Feld body eines Berichts vom Typ "csp-violation" aus der Reporting API. Die Eigenschaft nennt die URL der Ressource, deren Code den Verstoß ausgelöst hat. Beispiel: Ein externes Skript ruft eval() auf, obwohl die Richtlinie 'unsafe-eval' nicht erlaubt. Dann steht in sourceFile die URL dieses Skripts.
Den Wert erhalten Sie auf zwei Wegen:
- clientseitig über einen
ReportingObservermittypes: ["csp-violation"], - serverseitig als JSON-Bericht, den der Browser an den Endpunkt schickt, der in der CSP-Direktive
report-tound im HTTP-HeaderReporting-Endpointsfestgelegt ist.
Zusammen mit lineNumber und columnNumber zeigt sourceFile genau auf die Stelle im Code, die gegen die Richtlinie verstößt. Das ist beim Einführen einer strengen CSP sehr hilfreich, zum Beispiel im Modus Content-Security-Policy-Report-Only. So finden Sie heraus, welche eigenen Skripte oder Drittanbieter-Skripte noch Inline-Code, eval oder nicht erlaubte Quellen verwenden.
Verwechseln Sie sourceFile nicht mit blockedURL. blockedURL ist die Ressource, die blockiert wurde, etwa ein Bild von einer fremden Domain. sourceFile ist die Datei, deren Code den Verstoß verursacht hat.
Rückgabewert
null, wenn der Browser keine Quelldatei ermitteln kann. Bei Verstößen in Inline-Code steht hier meist die URL des Dokuments.Beispiele
CSP-Verstöße clientseitig mit ReportingObserver erfassen
const observer = new ReportingObserver((reports) => {
for (const report of reports) {
const { sourceFile, lineNumber, columnNumber, effectiveDirective } = report.body;
console.log(
`Verstoß gegen ${effectiveDirective} in ${sourceFile ?? 'unbekannt'}:${lineNumber}:${columnNumber}`
);
}
}, { types: ['csp-violation'], buffered: true });
observer.observe();
// Löst bei CSP ohne 'unsafe-eval' einen Verstoß aus
try {
eval('1 + 1');
} catch (err) {
console.warn('eval blockiert:', err.message);
}
Berichte serverseitig mit Node.js/Express entgegennehmen
// HTTP-Header der Seite:
// Reporting-Endpoints: csp="https://example.com/csp-reports"
// Content-Security-Policy: script-src 'self'; report-to csp
import express from 'express';
const app = express();
app.use(express.json({ type: ['application/reports+json', 'application/json'] }));
app.post('/csp-reports', (req, res) => {
const reports = Array.isArray(req.body) ? req.body : [req.body];
for (const report of reports) {
if (report.type !== 'csp-violation') continue;
const { sourceFile, blockedURL, lineNumber } = report.body;
console.log(`Quelle: ${sourceFile} (Zeile ${lineNumber}) -> blockiert: ${blockedURL}`);
}
res.sendStatus(204);
});
app.listen(3000);
Verstöße nach Quelldatei gruppieren
const counts = new Map();
const observer = new ReportingObserver((reports) => {
for (const { body } of reports) {
const key = body.sourceFile ?? '(ohne Quelle)';
counts.set(key, (counts.get(key) ?? 0) + 1);
}
console.table(Object.fromEntries(counts));
}, { types: ['csp-violation'] });
observer.observe();
// Wichtig · Fallstricke
- Kann
nullsein: Prüfen Sie den Wert vor der Weiterverarbeitung, zum Beispiel mit??. - Datenschutz und Herkunft: Ist die Quelldatei ursprungsübergreifend (Cross-Origin), kann der Browser die URL kürzen, etwa bis auf den Origin. Fragmente (
#...) werden entfernt. Rechnen Sie nicht immer mit der vollständigen URL. - Inline-Code: Bei Verstößen durch Inline-Skripte oder Event-Handler-Attribute steht in
sourceFilemeist die Dokument-URL und keine eigene Datei. Das Feldsamplehilft dann bei der Zuordnung. - Altes Format: Beim veralteten
report-uriheißt das Feldsource-file(Bindestrich-Schreibweise) im JSON-Objektcsp-report. Die Reporting API mitreport-toverwendet dagegensourceFile. - Browser-Kompatibilität: Berichte vom Typ
csp-violationüberReportingObserverundReporting-Endpointsgibt es vor allem in Chromium-Browsern. Für breitere Unterstützung können Sie zusätzlich das Ereignissecuritypolicyviolation(SecurityPolicyViolationEvent.sourceFile) auswerten. - Sicherheit: Berichts-Endpunkte nehmen Daten ohne Authentifizierung an. Validieren und begrenzen Sie eingehende Berichte, und geben Sie
sourceFilenie ungefiltert als HTML aus (XSS-Gefahr im Admin-Dashboard).