Signatur
Beschreibung
Der Konstruktor SecurityPolicyViolationEvent() erzeugt ein Ereignisobjekt, wie es der Browser normalerweise selbst auslöst, wenn eine Ressource oder ein Skript gegen die Content Security Policy verstößt. Solche Ereignisse gehen an document, an betroffene Elemente oder an einen Worker und steigen dabei im DOM auf (Bubbling).
Selbst gebraucht wird der Konstruktor vor allem in Tests und beim Simulieren von CSP-Verstößen. So lässt sich zum Beispiel prüfen, ob die eigene Logik zum Melden von Verstößen (Telemetrie, Logging) richtig arbeitet, ohne dass man eine echte Richtlinienverletzung auslösen muss.
Seit der aktuellen Spezifikation sind im options-Objekt die Felder documentURI, effectiveDirective, originalPolicy, disposition und statusCode Pflicht. Ältere Browser lassen options auch ganz weg. Weil ein selbst erzeugtes Ereignis nicht vom Browser stammt, steht isTrusted immer auf false.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses, üblicherweise "securitypolicyviolation". |
|
| $options Pflicht | object | Wörterbuch mit Ereignisdaten. Zusätzlich zu den Feldern aus EventInit (bubbles, cancelable, composed) gibt es folgende Felder:
|
Rückgabewert
SecurityPolicyViolationEvent-Objekt, dessen Eigenschaften mit den Werten aus options belegt sind.Beispiele
Ereignis erzeugen und Eigenschaften auslesen
const event = new SecurityPolicyViolationEvent('securitypolicyviolation', {
documentURI: 'https://example.com/',
effectiveDirective: 'script-src-elem',
originalPolicy: "script-src 'self'",
disposition: 'enforce',
statusCode: 200,
blockedURI: 'https://evil.example/tracker.js'
});
console.log(event.type);
console.log(event.effectiveDirective);
console.log(event.blockedURI);
console.log(event.isTrusted);
CSP-Meldelogik testen durch simulierten Verstoß
const reports = [];
document.addEventListener('securitypolicyviolation', (e) => {
reports.push({
directive: e.effectiveDirective,
blocked: e.blockedURI,
line: e.lineNumber
});
});
// Verstoß simulieren
document.dispatchEvent(new SecurityPolicyViolationEvent('securitypolicyviolation', {
documentURI: location.href,
effectiveDirective: 'img-src',
originalPolicy: "img-src 'self'",
disposition: 'report',
statusCode: 200,
blockedURI: 'https://cdn.example/bild.png',
lineNumber: 42,
bubbles: true
}));
console.log(reports);
Echte Verstöße an einen Server melden (on-Property)
document.onsecuritypolicyviolation = async (e) => {
await fetch('/csp-report', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
directive: e.effectiveDirective,
blocked: e.blockedURI,
source: e.sourceFile,
sample: e.sample,
trusted: e.isTrusted
}),
keepalive: true
});
};
// Wichtig · Fallstricke
- Pflichtfelder: Moderne Browser werfen einen
TypeError, wenn inoptionsPflichtfelder wiedocumentURI,effectiveDirective,originalPolicy,dispositionoderstatusCodefehlen. - Bubbling: Wenn nichts angegeben ist, gilt
bubbles: false. Der Browser selbst löst das Ereignis dagegen mit Bubbling aus. Für realistische Tests setzt man daherbubbles: trueundcomposed: true. - Sicherheit: Ein selbst erzeugtes Ereignis hat
isTrusted === false. Das Ereignis löst keine echte CSP-Meldung aus und sendet nichts anreport-urioderreport-to. Da jedes Skript auf der Seite gefälschte Ereignisse auslösen kann, sollte ein Handler, der Verstöße meldet,isTrustedprüfen. violatedDirectiveist veraltet. StattdesseneffectiveDirectiveverwenden.sampleenthält höchstens 40 Zeichen und nur dann einen Wert, wenn die Richtlinie'report-sample'enthält.- Kompatibilität: Chromium, Firefox und Safari unterstützen den Konstruktor. Im Internet Explorer gibt es ihn nicht.