Start · Sprachen · JavaScript · Referenz · IntegrityViolationReport

IntegrityViolationReport

Schnittstelle

Ein Bericht der Reporting API mit dem Typ <code>"integrity-violation"</code>. Er entsteht, wenn eine Ressource gegen die <code>Integrity-Policy</code> des Dokuments verstößt.

seit JavaScript Experimentell: Chromium 138+ (noch nicht Baseline) Kategorie: webapi

Signatur

dictionary IntegrityViolationReport { type: "integrity-violation"; url; body: IntegrityViolationReportBody }

Beschreibung

Das Wörterbuch IntegrityViolationReport beschreibt einen Bericht der Reporting API. Der Browser erzeugt ihn, wenn ein Dokument gegen seine Integritätsrichtlinie verstößt. Die Richtlinie legen Sie mit den HTTP-Headern Integrity-Policy oder Integrity-Policy-Report-Only fest. Damit können Sie z. B. erzwingen, dass jedes geladene Skript ein gültiges integrity-Attribut hat (Subresource Integrity, SRI). Ein <script src="…"> ohne Integritäts-Metadaten ist dann ein Verstoß.

Der Bericht hat den Aufbau aller Reporting-API-Berichte:

  • type: immer "integrity-violation"
  • url: die URL des Dokuments, in dem der Verstoß aufgetreten ist
  • body: ein IntegrityViolationReportBody mit den Einzelheiten

Im body stehen documentURL (URL des Dokuments), blockedURL (URL der betroffenen Ressource), destination (Ressourcentyp, derzeit "script") und reportOnly. reportOnly ist true, wenn der Verstoß nur gemeldet und nicht blockiert wurde.

Auf zwei Wegen kommen Sie an die Berichte: Im Browser lesen Sie sie mit einem ReportingObserver und dem Typfilter "integrity-violation". Oder Sie lassen sie an einen Server-Endpunkt schicken, den Sie mit Reporting-Endpoints festlegen und in der Richtlinie mit endpoints=(…) angeben. Ein sinnvoller Ablauf für die Einführung: Starten Sie mit Integrity-Policy-Report-Only, sammeln Sie alle Skripte ohne SRI und stellen Sie danach auf erzwingenden Betrieb um.

Rückgabewert

Typ
IntegrityViolationReport
Beschreibung
Ein Berichtsobjekt. Sie erhalten es im Callback eines ReportingObserver, über observer.takeRecords() oder als JSON am Reporting-Endpunkt.

Beispiele

Integritätsrichtlinie per HTTP-Header aktivieren (Node.js/Express)

import express from 'express';

const app = express();

app.use((req, res, next) => {
  // Endpunkt für Berichte festlegen
  res.setHeader('Reporting-Endpoints', 'integrity-endpoint="https://example.com/reports"');
  // Nur melden, nicht blockieren: Skripte ohne SRI werden gemeldet
  res.setHeader(
    'Integrity-Policy-Report-Only',
    'blocked-destinations=(script), endpoints=(integrity-endpoint)'
  );
  next();
});

app.use(express.static('public'));
app.listen(3000, () => console.log('Server läuft auf Port 3000'));
Server läuft auf Port 3000

Verstöße im Browser mit ReportingObserver auslesen

const observer = new ReportingObserver((reports) => {
  for (const report of reports) {
    const { documentURL, blockedURL, destination, reportOnly } = report.body;
    console.log(`[${report.type}] ${destination} ${blockedURL}`);
    console.log(`Dokument: ${documentURL}, nur melden: ${reportOnly}`);
  }
}, { types: ['integrity-violation'], buffered: true });

observer.observe();

// Ein Skript ohne integrity-Attribut erzeugt einen Verstoß
const script = document.createElement('script');
script.src = 'https://cdn.example.com/lib.js';
document.head.append(script);
[integrity-violation] script https://cdn.example.com/lib.js Dokument: https://example.com/, nur melden: true

Berichte am Server-Endpunkt empfangen

import express from 'express';

const app = express();
app.use(express.json({ type: 'application/reports+json' }));

app.post('/reports', (req, res) => {
  const violations = req.body.filter((r) => r.type === 'integrity-violation');
  for (const { url, body } of violations) {
    console.warn('SRI fehlt:', body.blockedURL, 'auf', url);
  }
  res.sendStatus(204);
});

app.listen(3000);
SRI fehlt: https://cdn.example.com/lib.js auf https://example.com/

Browser-Unterstützung prüfen und Richtlinie erzwingen

// Vorher per Header gesetzt:
// Integrity-Policy: blocked-destinations=(script), endpoints=(integrity-endpoint)

if (!('ReportingObserver' in globalThis)) {
  console.log('ReportingObserver wird nicht unterstützt');
} else {
  const observer = new ReportingObserver((reports) => {
    const blocked = reports.filter((r) => !r.body.reportOnly);
    console.log(`${blocked.length} Skript(e) blockiert`);
  }, { types: ['integrity-violation'] });
  observer.observe();
}
1 Skript(e) blockiert

// Wichtig · Fallstricke

  • Experimentell: Integrity-Policy und der Berichtstyp "integrity-violation" gibt es derzeit nur in Chromium-Browsern (ab Version 138). Firefox und Safari erzeugen keine solchen Berichte. Verlassen Sie sich deshalb nicht allein darauf.
  • Es gibt keinen Konstruktor. Berichte erzeugt nur der Browser. Sie können sie nur lesen.
  • Derzeit ist nur destination = "script" spezifiziert. Stylesheets und andere Ressourcentypen werden (noch) nicht geprüft.
  • Geprüft wird nur, ob Integritäts-Metadaten vorhanden sind. Ob ein Hash falsch ist, meldet die normale SRI-Prüfung: Das Laden schlägt dann fehl und es gibt einen Konsolenfehler.
  • Ohne Reporting-Endpunkt (Reporting-Endpoints und endpoints=(…)) werden Berichte nur lokal an ReportingObserver übergeben. Der Browser verschickt sie gebündelt und verzögert, also nicht in Echtzeit.
  • Sicherheit: blockedURL kann URLs mit Query-Parametern enthalten, z. B. Tokens. Speichern Sie Berichte daher datenschutzgerecht. Behandeln Sie außerdem eingehende Berichte am Endpunkt als nicht vertrauenswürdige Eingaben, denn sie lassen sich fälschen.
  • Die Richtlinie gilt zusätzlich zur Content Security Policy und ersetzt sie nicht. Am besten kombinieren Sie beide.