Start · Sprachen · JavaScript · Referenz · SecurityPolicyViolationEvent.lineNumber

SecurityPolicyViolationEvent.lineNumber

Eigenschaft

Nur lesbare Eigenschaft: die Zeilennummer im Dokument oder Worker-Skript, an der die Verletzung der Content Security Policy (CSP) aufgetreten ist.

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

Signatur

SecurityPolicyViolationEvent.lineNumber

Beschreibung

Die Eigenschaft lineNumber des Interfaces SecurityPolicyViolationEvent ist nur lesbar. Sie enthält die Zeilennummer in der Ressource, die die Verletzung der Content Security Policy ausgelöst hat. Das kann ein Inline-Skript im Dokument sein, ein externes Skript oder ein Worker-Skript. Welche Datei gemeint ist, steht in sourceFile. Zusammen mit columnNumber lässt sich die Stelle im Quelltext genau bestimmen.

Die Eigenschaft hilft vor allem beim Debugging und Monitoring: Wer eine neue CSP einführt, meist zuerst im Modus Content-Security-Policy-Report-Only, kann mit einem Listener für das Event securitypolicyviolation alle Verstöße samt Fundstelle sammeln und an einen eigenen Endpunkt senden.

Kann der Browser keine Position ermitteln, ist der Wert 0. Das passiert zum Beispiel, wenn eine blockierte Ressource per <img>-Tag oder über HTTP-Header geladen wird und kein Skript beteiligt ist.

Rückgabewert

Typ
number
Beschreibung
Eine ganze Zahl ohne Vorzeichen, die mit 1 zu zählen beginnt: die Zeile der Verletzung in der Ressource aus sourceFile. Ist keine Position bekannt, ist der Wert 0.

Beispiele

CSP-Verstöße mit Fundstelle in der Konsole ausgeben

document.addEventListener('securitypolicyviolation', (event) => {
  console.warn(
    `CSP-Verstoß gegen "${event.violatedDirective}" in ` +
    `${event.sourceFile || '(unbekannt)'}:${event.lineNumber}:${event.columnNumber}`
  );
});

// Ein Inline-Handler löst bei der CSP "script-src 'self'" einen Verstoß aus
const btn = document.createElement('button');
btn.setAttribute('onclick', 'alert(1)');
document.body.append(btn);
CSP-Verstoß gegen "script-src-attr" in https://example.com/app.js:9:5

Verstöße an einen Monitoring-Endpunkt melden

const reportViolation = (event) => {
  const payload = {
    directive: event.effectiveDirective,
    blockedURI: event.blockedURI,
    sourceFile: event.sourceFile,
    line: event.lineNumber,
    column: event.columnNumber,
    sample: event.sample
  };
  // sendBeacon funktioniert auch, wenn die Seite gerade entladen wird
  navigator.sendBeacon('/csp-report', JSON.stringify(payload));
};

document.addEventListener('securitypolicyviolation', reportViolation);

Verstöße ohne Positionsangabe filtern

self.addEventListener('securitypolicyviolation', (event) => {
  if (event.lineNumber === 0) {
    console.info('Verstoß ohne Positionsangabe:', event.blockedURI);
    return;
  }
  console.info(`Zeile ${event.lineNumber} in ${event.sourceFile}`);
});
Verstoß ohne Positionsangabe: https://cdn.example.org/bild.png

// Wichtig · Fallstricke

  • Der Wert 0 bedeutet „unbekannt“: Viele Verstöße, etwa blockierte Bilder, Stylesheets oder Frames, haben keine Zeilennummer. Prüfe den Wert deshalb vor der Auswertung.
  • Browser entfernen Angaben: Bei Skripten von fremden Origins können Browser sourceFile auf den Origin kürzen und lineNumber auf 0 setzen, damit keine Informationen zwischen Origins durchsickern.
  • Verkleinerter Code: In minifiziertem Code steht fast alles in Zeile 1. Die Angabe ist dann nur zusammen mit columnNumber und einer Source-Map nützlich.
  • Nicht mit anderen Events verwechseln: In Firefox gibt es eine nicht standardisierte Eigenschaft Error.prototype.lineNumber. Sie hat mit dieser Eigenschaft nichts zu tun.
  • Kompatibilität: Wird in allen modernen Browsern unterstützt. Das Event wird auch in Workern ausgelöst. Der Internet Explorer unterstützt es nicht.
  • Vertrauen: Berichte an deinen Endpunkt können gefälscht sein. Speichere eingehende Daten nur geprüft und mit einer Mengenbegrenzung.