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, undtrue
, 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:
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.
<script
src="https://example.com/example-framework.js"
crossorigin="anonymous"></script>
Hinweis: Ein Skript, das mit der Richtlinie übereinstimmt, könnte so aussehen:
<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:
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.
{
"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:
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:
<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.
{
"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
Loading…