Start · Sprachen · JavaScript · Referenz · SecurityPolicyViolationEvent.blockedURI

SecurityPolicyViolationEvent.blockedURI

Eigenschaft

Schreibgeschützter String mit der URI der Ressource, die blockiert wurde, weil sie gegen eine Content Security Policy (CSP) verstößt.

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

Signatur

SecurityPolicyViolationEvent.blockedURI

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 von eval(), 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

Typ
string
Beschreibung
Die URI der blockierten Ressource. Bei Cross-Origin-Weiterleitungen ist sie auf den Ursprung gekürzt. Bei Inline-Code, 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);
CSP-Verstoß: https://cdn.example.com/lib.js (Direktive: script-src-elem)

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 */ }
eval() / new Function()

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 TypeError geworfen. Eigene Werte lassen sich nur über den Konstruktor new 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: blockedURI kann Query-Parameter mit personenbezogenen Daten enthalten. Vor dem Speichern sollte man diese bereinigen. Außerdem sollte man den Wert nie ungeprüft per innerHTML ausgeben, sonst droht XSS.
  • Event-Handler in der Richtlinie: Das Event wird auch im Modus Report-Only ausgelöst. Dann ist disposition === '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üssel blocked-uri, die Reporting API dagegen blockedURL.
  • Außer in Fenstern ist das Event auch in Web Workern verfügbar.