Signatur
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
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);
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}`);
});
// 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
sourceFileauf den Origin kürzen undlineNumberauf0setzen, damit keine Informationen zwischen Origins durchsickern. - Verkleinerter Code: In minifiziertem Code steht fast alles in Zeile 1. Die Angabe ist dann nur zusammen mit
columnNumberund 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.