Start · Sprachen · JavaScript · Referenz · SecurityPolicyViolationEvent.sourceFile

SecurityPolicyViolationEvent.sourceFile

Eigenschaft

Nur lesbarer String mit der URL der Ressource (meist ein Skript), in der die Content-Security-Policy-Verletzung ausgelöst wurde.

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

Signatur

SecurityPolicyViolationEvent.sourceFile

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

Typ
string
Beschreibung
URL der Quelldatei, in der die Verletzung ausgelöst wurde. Ist keine Quelle bekannt (z. B. bei manchen Ressourcen-Blockaden), ist der Wert ein leerer String "". 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}`);
});
Verletzte Direktive: script-src-elem Quelldatei: https://example.com/js/app.js Position: Zeile 42, Spalte 7

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}`);
  }
});
Fremdes Skript https://cdn.tracker.example verletzt script-src

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);
https://example.com/js/legacy.js

// 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 sourceFile ein leerer String. Prüfe den Wert deshalb immer, bevor du ihn mit new 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 blockedURI verwechseln: blockedURI ist die blockierte Ressource, sourceFile dagegen 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 wie chrome-extension://… oder moz-extension://…. Diese solltest du beim Auswerten herausfiltern.
  • Die Eigenschaft ist schreibgeschützt. Setzen lässt sie sich nur über das eventInitDict im Konstruktor.