Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

IntegrityViolationReportBody

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

Das IntegrityViolationReportBody-Wörterbuch ist eine Erweiterung der Reporting API, die den Inhalt eines Berichts über Verstöße gegen eine Integrity Policy darstellt.

Berichte über Integritätsverletzungen können an Reporting-Server-Endpunkte oder über einen ReportingObserver gemeldet werden. Sie haben einen type von "integrity-violation", eine url, die das Dokument angibt, das den Verstoß enthält, und eine body-Eigenschaft, die ein Objekt ist, das zu diesem Wörterbuch passt.

Instanz-Eigenschaften

blockedURL Schreibgeschützt

Ein String, der die URL der Ressource darstellt, die durch eine durchgesetzte Integritätsrichtlinie blockiert wurde (oder nur für eine reportOnly-Richtlinie gemeldet wurde).

documentURL Schreibgeschützt

Ein String, der die URL des Dokuments darstellt, das versucht, die Ressource zu laden.

destination Schreibgeschützt

Ein String, der das Request.destination der blockierten Ressource angibt. Derzeit kann dies nur "script" sein.

reportOnly Schreibgeschützt

Ein Boolean: false, wenn die Richtlinie durchgesetzt wurde, und true, wenn der Verstoß nur gemeldet wurde.

Beschreibung

Integritätsrichtlinien-Verstöße werden gemeldet, wenn ein Dokument versucht, eine Ressource zu laden, die die Subresource Integrity-Garantie einer Richtlinie nicht erfüllt, die mit entweder dem Integrity-Policy oder dem Integrity-Policy-Report-Only HTTP-Header festgelegt wurde.

Konkret wird ein Bericht gesendet, wenn ein Dokument versucht, eine <script>-Ressource (oder ein anderes im Policy aufgelistetes Request-Destination) zu laden, die keine gültigen Integritätsmetadaten enthält, oder eine Anfrage im no-cors Modus zu stellen.

Verletzungsberichte können innerhalb eines verletzenden Dokuments über einen ReportingObserver-Callback (definiert im ReportingObserver() Konstruktor) abgerufen werden, indem auf Berichtobjekte gefiltert wird, die einen type von "integrity-violation" haben.

Verletzungsberichte können auch als JSON-Objekte in POST-Anfragen an die in den Integrity-Policy und Integrity-Policy-Report-Only Headern angegebenen endpoints gesendet werden. Die JSON-Berichtsobjekte sind eine Serialisierung der Berichte, die im ReportingObserver zurückgegeben werden, und haben daher ebenfalls einen type von "integrity-violation" und eine body-Eigenschaft, die eine Serialisierung dieses Objekts ist. Beachten Sie, dass Endpoint-Werte, die in der Richtlinie festgelegt sind, auf Kennungen abgebildet werden müssen, die mit dem Reporting-Endpoints Header festgelegt wurden.

Beispiele

Berichterstattung mit der API

Dieses Beispiel zeigt, wie Sie Berichte über Integritätsrichtlinien-Verstöße mit einem ReportingObserver erhalten können.

Zuerst setzen wir die Integritätsrichtlinie einer Seite mit dem Integrity-Policy. Die unten stehende Richtlinie meldet und blockiert das Laden von Ressourcen eines jeden <script>-Elementes oder HTMLScriptElement Objekts, das kein integrity-Attribut angibt, oder wenn eine Skript-Ressource im no-cors Modus angefordert wird. Beachten Sie, dass wir in diesem Beispiel nur daran interessiert sind, die Verstöße mit der API zu melden, weshalb wir die Reporting-Endpunkte weglassen:

http
Integrity-Policy: blocked-destinations=(script)

Als nächstes gehen wir davon aus, dass unsere Seite das folgende Element enthält, um ein Skript zu laden. Weil wir einen Verstoß auslösen möchten, wird das integrity-Attribut, das verwendet wird, um das Skript mit unserer erwarteten Version abzugleichen, ausgelassen. Wir könnten auch das cross-origin Attribut auslassen, damit die Anfrage im no-cors Modus gesendet wird.

html
<script
  src="https://example.com/example-framework.js"
  crossorigin="anonymous"></script>

Hinweis: Ein Skript, das mit der Richtlinie übereinstimmt, könnte so aussehen:

html
<script
  src="https://example.com/example-framework.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
  crossorigin="anonymous"></script>

Um Verstöße innerhalb der Seite zu beobachten, konstruieren wir ein neues ReportingObserver Objekt, um auf Berichte mit dem Typ "integrity-violation" zu hören, und übergeben einen Callback, der die Berichte empfängt und protokolliert. Dieser Code muss vor dem Skript, das den Verstoß verursacht, auf derselben Seite geladen werden:

js
const observer = new ReportingObserver(
  (reports, observer) => {
    reports.forEach((violation) => {
      console.log(violation);
      console.log(JSON.stringify(violation));
    });
  },
  {
    types: ["integrity-violation"],
    buffered: true,
  },
);

observer.observe();

Oben protokollieren wir jedes Verletzungsbericht-Objekt und eine JSON-String-Version des Objekts, die ähnlich wie das unten stehende Objekt aussehen könnte.

json
{
  "type": "integrity-violation",
  "url": "https://example.com",
  "body": {
    "documentURL": "https://example.com",
    "blockedURL": "https://example.com/example-framework.js",
    "destination": "script",
    "reportOnly": false
  }
}

Senden eines Berichts an einen Reporting-Endpunkt

Die Konfiguration einer Webseite zum Senden eines Berichts über Integritätsrichtlinien-Verstöße an einen Reporting-Server-Endpunkt ähnelt dem vorherigen Beispiel sehr.

Der Hauptunterschied besteht darin, dass wir einen oder mehrere Reporting-Endpunkte angeben müssen, an die wir die Berichte senden möchten, indem wir den Reporting-Endpoints Antwort-Header verwenden, und diese dann im endpoints-Feld bei der Festlegung der Richtlinie referenzieren.

Sie können dies unten sehen, wo wir zuerst zwei Endpunkte definieren — integrity-endpoint und backup-integrity-endpoint — und diese dann in unserer Richtlinie referenzieren:

http
Reporting-Endpoints: integrity-endpoint=https://example.com/integrity, backup-integrity-endpoint=https://report-provider.example/integrity
Integrity-Policy: blocked-destinations=(script), endpoints=(integrity-endpoint, backup-integrity-endpoint)

Wir können einen Verstoß auslösen, indem wir ein externes Skript von der Seite laden, das die Subresource-Integritätsrichtlinien nicht erfüllt. Nur um sich vom vorherigen Beispiel zu unterscheiden, senden wir die Anfrage hier im no-cors Modus:

html
<script
  src="https://example.com/example-framework.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"></script>

Der Verletzungsbericht wird dann als JSON-Datei an den angegebenen Endpunkt gesendet. Wie Sie im Beispiel unten sehen können, ist der type "integrity-violation" und die body-Eigenschaft ist eine Serialisierung dieses IntegrityViolationReportBody Objekts:

Der Bericht in diesem Fall würde genauso aussehen wie unser JSON-Bericht im vorherigen Beispiel.

json
{
  "type": "integrity-violation",
  "url": "https://example.com",
  "body": {
    "documentURL": "https://example.com",
    "blockedURL": "https://example.com/example-framework.js",
    "destination": "script",
    "reportOnly": false
  }
}

Spezifikationen

Specification
Subresource Integrity
# report-violations

Browser-Kompatibilität

Siehe auch