Signatur
Beschreibung
Die schreibgeschützte Eigenschaft sourceFile eines SecurityPolicyViolationEvent gibt die URL der Datei an, in der die CSP-Verletzung aufgetreten ist. Das ist meist ein Skript, das z. B. eval() aufruft, einen Inline-Handler setzt oder eine blockierte Ressource nachlädt. Bei Inline-Code im HTML-Dokument steht hier oft die URL des Dokuments selbst.
Zusammen mit lineNumber und columnNumber lässt sich die genaue Codestelle finden, die gegen die Richtlinie verstößt. Das ist sehr hilfreich, wenn man eine CSP zuerst im Modus Content-Security-Policy-Report-Only einführt und Verstöße sammelt, bevor man sie scharf schaltet.
Den Wert liest man in einem Listener für das Event securitypolicyviolation, das auf document, window oder dem betroffenen Element ausgelöst wird. Er entspricht dem Feld source-file in CSP-Berichten, die per report-uri bzw. report-to gesendet werden.
Rückgabewert
"". Bei ursprungsübergreifenden Skripten kann die URL gekürzt werden, z. B. nur auf den Ursprung.Beispiele
Quelldatei einer CSP-Verletzung protokollieren
document.addEventListener('securitypolicyviolation', (event) => {
console.log('Verletzte Direktive:', event.violatedDirective);
console.log('Quelldatei:', event.sourceFile || '(unbekannt)');
console.log(`Position: Zeile ${event.lineNumber}, Spalte ${event.columnNumber}`);
});
Verstöße gesammelt an einen Server melden
const reports = [];
document.addEventListener('securitypolicyviolation', (e) => {
reports.push({
directive: e.effectiveDirective,
blocked: e.blockedURI,
sourceFile: e.sourceFile,
line: e.lineNumber,
column: e.columnNumber,
disposition: e.disposition // 'enforce' oder 'report'
});
});
// Beim Verlassen der Seite gebündelt senden
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'hidden' && reports.length > 0) {
navigator.sendBeacon('/csp-reports', JSON.stringify(reports));
reports.length = 0;
}
});
Nur Verstöße aus Drittanbieter-Skripten auswerten
const ownOrigin = location.origin;
document.addEventListener('securitypolicyviolation', ({ sourceFile, violatedDirective }) => {
if (!sourceFile) return;
const origin = new URL(sourceFile, location.href).origin;
if (origin !== ownOrigin) {
console.warn(`Fremdes Skript ${origin} verletzt ${violatedDirective}`);
}
});
Event manuell erzeugen (z. B. für Tests)
const evt = new SecurityPolicyViolationEvent('securitypolicyviolation', {
documentURI: location.href,
violatedDirective: 'script-src',
effectiveDirective: 'script-src',
originalPolicy: "script-src 'self'",
disposition: 'enforce',
statusCode: 200,
sourceFile: 'https://example.com/js/legacy.js',
lineNumber: 10,
columnNumber: 3
});
console.log(evt.sourceFile);
// Wichtig · Fallstricke
- Kann leer sein: Wird z. B. ein Bild oder Stylesheet direkt durch HTML blockiert, gibt es oft keine auslösende Skriptdatei. Dann ist
sourceFileein leerer String. Prüfe den Wert deshalb immer, bevor du ihn mitnew URL()parst. - Datenschutz bei fremden Ursprüngen: Browser können die URL bei ursprungsübergreifenden Skripten auf den Ursprung kürzen oder ganz weglassen, damit keine sensiblen Pfade oder Query-Parameter nach außen gelangen.
- Nicht mit
blockedURIverwechseln:blockedURIist die blockierte Ressource,sourceFiledagegen die Datei, deren Code die Verletzung ausgelöst hat. - Sicherheit: Der Wert ist nicht vertrauenswürdig, denn Angreifer oder Browser-Erweiterungen können Verletzungen mit beliebigen URLs auslösen. Auf dem Server nicht ungeprüft als HTML ausgeben (Gefahr von XSS im Report-Dashboard).
- Browser-Erweiterungen erzeugen häufig Verstöße mit
sourceFile-Werten wiechrome-extension://…odermoz-extension://…. Diese solltest du beim Auswerten herausfiltern. - Die Eigenschaft ist schreibgeschützt. Setzen lässt sie sich nur über das
eventInitDictim Konstruktor.