Signatur
Beschreibung
Die Eigenschaft blockedURI eines SecurityPolicyViolationEvent gibt an, welche Ressource der Browser wegen eines Verstoßes gegen die Content Security Policy blockiert hat, etwa ein externes Skript, ein Bild, ein Stylesheet oder ein Ziel von fetch(). Das Event wird am document, am betroffenen Element oder im Worker-Kontext als securitypolicyviolation ausgelöst.
Nicht jeder Wert ist eine vollständige URL. Bei bestimmten Verstößen liefert der Browser Schlüsselwörter statt einer Adresse:
"inline": Inline-Skript, Inline-Style oder Event-Handler-Attribut (z. B.onclick="…")"eval": Aufruf voneval(),new Function()o. Ä."wasm-eval": blockierte WebAssembly-Kompilierung"trusted-types-policy"bzw."trusted-types-sink": Verstöße gegen Trusted Types- ein Schema wie
"data"oder"blob", wenn nur das Schema gemeldet wird
Die Eigenschaft eignet sich vor allem für clientseitiges CSP-Monitoring: Beim Einführen einer Richtlinie (häufig zuerst im Modus Content-Security-Policy-Report-Only) lässt sich damit herausfinden, welche Quellen noch fehlen, bevor die Richtlinie scharf geschaltet wird. Zusammen mit violatedDirective/effectiveDirective, sourceFile und lineNumber kann man den Verstoß genau eingrenzen.
Rückgabewert
eval und ähnlichen Fällen steht dort ein Schlüsselwort wie "inline" oder "eval". Kann auch ein leerer String sein.Beispiele
Blockierte Ressourcen per addEventListener protokollieren
// CSP z. B.: Content-Security-Policy: script-src 'self'
document.addEventListener('securitypolicyviolation', (event) => {
console.warn(
`CSP-Verstoß: ${event.blockedURI} (Direktive: ${event.effectiveDirective})`
);
});
// Löst einen Verstoß aus: externes Skript von fremder Domain
const script = document.createElement('script');
script.src = 'https://cdn.example.com/lib.js';
document.head.append(script);
Schlüsselwörter wie "inline" und "eval" unterscheiden
const describeBlocked = (uri) => {
switch (uri) {
case 'inline': return 'Inline-Code (Skript, Style oder Event-Handler)';
case 'eval': return 'eval() / new Function()';
case 'wasm-eval': return 'WebAssembly-Kompilierung';
case '': return 'unbekannt';
default: return `externe Ressource: ${uri}`;
}
};
document.onsecuritypolicyviolation = (event) => {
console.log(describeBlocked(event.blockedURI));
};
// Bei script-src 'self' ohne 'unsafe-eval':
try { eval('1 + 1'); } catch (e) { /* EvalError */ }
Verstöße gesammelt an einen Server melden
const queue = [];
document.addEventListener('securitypolicyviolation', (e) => {
queue.push({
blockedURI: e.blockedURI,
directive: e.effectiveDirective,
source: e.sourceFile,
line: e.lineNumber,
disposition: e.disposition // 'enforce' oder 'report'
});
});
// Beim Verlassen der Seite gebündelt senden
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'hidden' && queue.length) {
navigator.sendBeacon('/csp-report', JSON.stringify(queue.splice(0)));
}
});
// Wichtig · Fallstricke
- Schreibgeschützt: Wer der Eigenschaft etwas zuweist, bewirkt nichts; im Strict Mode wird ein
TypeErrorgeworfen. Eigene Werte lassen sich nur über den Konstruktornew SecurityPolicyViolationEvent(type, { blockedURI })setzen. - Datenschutz bei Weiterleitungen: Wird eine Anfrage auf einen anderen Ursprung umgeleitet, meldet der Browser oft nur den Ursprung (z. B.
https://example.com) und nicht die volle URL. So werden keine sensiblen Pfade oder Token verraten. - Werte nicht blind vertrauen:
blockedURIkann Query-Parameter mit personenbezogenen Daten enthalten. Vor dem Speichern sollte man diese bereinigen. Außerdem sollte man den Wert nie ungeprüft perinnerHTMLausgeben, sonst droht XSS. - Event-Handler in der Richtlinie: Das Event wird auch im Modus
Report-Onlyausgelöst. Dann istdisposition === 'report'und die Ressource wurde nicht tatsächlich blockiert. - Browserunterschiede: Ältere Browser liefern bei Inline-Verstößen teils einen leeren String oder die Dokument-URL statt
"inline". Das Serverformat (report-uri) verwendet den Schlüsselblocked-uri, die Reporting API dagegenblockedURL. - Außer in Fenstern ist das Event auch in Web Workern verfügbar.