Webanwendung mit der Reporting API überwachen

Mit der Reporting API können Sie unter anderem Sicherheitsverstöße und eingestellte API-Aufrufe überwachen.

Maud Nalpas
Maud Nalpas

Einige Fehler treten nur in der Produktionsumgebung auf. Lokal oder während der Entwicklung sind sie nicht zu sehen, da echte Nutzer, echte Netzwerke und echte Geräte das Spiel verändern. Die Reporting API hilft, einige dieser Fehler zu erkennen, z. B. Sicherheitsverstöße oder nicht mehr unterstützte und bald eingestellte API-Aufrufe auf Ihrer Website, und überträgt sie an einen von Ihnen angegebenen Endpunkt.

Sie können damit über HTTP-Header angeben, was Sie überwachen möchten. Die Funktion wird vom Browser ausgeführt.

Durch die Einrichtung der Reporting API haben Sie die Gewissheit, dass Nutzer solche Fehler sehen und sie beheben können.

In diesem Beitrag wird beschrieben, welche Möglichkeiten diese API bietet und wie sie verwendet wird. Legen wir los.

Demo und Code

Sehen Sie sich die Reporting API in Aktion ab Chrome 96 und höher (Chrome Beta oder Canary, Stand Oktober 2021) an.

Übersicht

Diagramm, in dem die folgenden Schritte zusammengefasst sind – von der Berichterstellung bis zum Berichtzugriff durch den Entwickler
Wie werden Berichte generiert und gesendet?

Angenommen, Ihre Website site.example hat eine Content-Security-Policy und eine Dokumentenrichtlinie. Sie wissen nicht, was diese Funktionen tun? Das ist in Ordnung, Sie werden dieses Beispiel immer noch verstehen.

Sie möchten Ihre Website im Blick behalten, um zu erfahren, wann gegen diese Richtlinien verstoßen wird, aber auch, weil Sie APIs im Auge behalten möchten, die eingestellt wurden oder bald eingestellt werden und die möglicherweise in Ihrer Codebasis verwendet werden.

Dazu konfigurieren Sie einen Reporting-Endpoints-Header und ordnen diese Endpunktnamen bei Bedarf über die report-to-Anweisung in Ihren Richtlinien zu.

Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"
# Content-Security-Policy violations and Document-Policy violations
# will be sent to main-endpoint
Content-Security-Policy: script-src 'self'; object-src 'none'; report-to main-endpoint;
Document-Policy: document-write=?0; report-to=main-endpoint;
# Deprecation reports don't need an explicit endpoint because
# these reports are always sent to the `default` endpoint

Wenn etwas Unvorhergesehenes passiert, verstoßen einige Ihrer Nutzer gegen diese Richtlinien.

Beispiele für Verstöße

index.html

<script src="script.js"></script>
<!-- CSP VIOLATION: Try to load a script that's forbidden as per the Content-Security-Policy -->
<script src="https://example.com/script.js"></script>

script.js, geladen von index.html

// DOCUMENT-POLICY VIOLATION: Attempt to use document.write despite the document policy
try {
  document
.write('<h1>hi</h1>');
} catch (e) {
  console
.log(e);
}
// DEPRECATION: Call a deprecated API
const webkitStorageInfo = window.webkitStorageInfo;

Der Browser generiert einen Bericht zu CSP-Verstößen, einen Bericht zu Verstößen gegen Dokumentrichtlinien und einen Bericht zur Einstellung, in denen diese Probleme erfasst werden.

Mit einer kurzen Verzögerung von bis zu einer Minute sendet der Browser die Berichte dann an den Endpunkt, der für diesen Verstoßtyp konfiguriert wurde. Die Berichte werden vom Browser selbst out-of-band gesendet (nicht von Ihrem Server oder Ihrer Website).

Die Endpunkte erhalten diese Berichte.

Sie können jetzt auf die Berichte zu diesen Endpunkten zugreifen und nachvollziehen, was schiefgelaufen ist. Sie sind bereit, mit der Fehlerbehebung für das Problem zu beginnen, das Ihre Nutzer betrifft.

Beispielbericht

{
 
"age": 2,
 
"body": {
   
"blockedURL": "https://site2.example/script.js",
   
"disposition": "enforce",
   
"documentURL": "https://site.example",
   
"effectiveDirective": "script-src-elem",
   
"originalPolicy": "script-src 'self'; object-src 'none'; report-to main-endpoint;",
   
"referrer": "https://site.example",
   
"sample": "",
   
"statusCode": 200
 
},
 
"type": "csp-violation",
 
"url": "https://site.example",
 
"user_agent": "Mozilla/5.0... Chrome/92.0.4504.0"
}

Anwendungsfälle und Berichtstypen

Die Reporting API kann so konfiguriert werden, dass Sie viele Arten von Warnungen oder Problemen auf Ihrer Website im Blick behalten können:

Berichtstyp Beispiel für eine Situation, in der ein Bericht generiert wird
CSP-Verstoß (nur Level 3) Sie haben auf einer Ihrer Seiten ein Content-Security-Policy (Content-Sicherheits-Policy) festgelegt, aber die Seite versucht, ein Script zu laden, das von Ihrem CSP nicht zulässig ist.
Verstoß gegen die COPPA-Richtlinien Sie haben auf einer Seite ein Cross-Origin-Opener-Policy festgelegt, aber ein fensterübergreifendes Fenster versucht, direkt mit dem Dokument zu interagieren.
Verstoß gegen die COEP Sie haben auf einer Seite ein Cross-Origin-Embedder-Policy festgelegt, das Dokument enthält aber einen ursprungsübergreifenden iFrame, der nicht für das Laden durch ursprungsübergreifende Dokumente aktiviert wurde.
Verstoß gegen die Dokumentrichtlinie Die Seite hat eine Dokumentenrichtlinie, die die Verwendung von document.write verhindert, aber ein Script versucht, document.write aufzurufen.
Verstoß gegen die Berechtigungsrichtlinie Auf der Seite gibt es eine Berechtigungsrichtlinie, die die Nutzung des Mikrofons verhindert, sowie ein Script, das eine Audioeingabe anfordert.
Warnung zur Einstellung Auf der Seite wird eine API verwendet, die eingestellt wurde oder eingestellt wird. Sie wird direkt oder über ein Drittanbieter-Script auf oberster Ebene aufgerufen.
Intervention Auf der Seite wird eine Aktion ausgeführt, die vom Browser aus Gründen der Sicherheit, Leistung oder Nutzerfreundlichkeit nicht berücksichtigt wird. Beispiel in Chrome: Die Seite verwendet document.write in langsamen Netzwerken oder ruft navigator.vibrate in einem Frame mit unterschiedlichen Ursprüngen auf, mit dem der Nutzer noch nicht interagiert hat.
Unfall Der Browser stürzt ab, während Ihre Website geöffnet ist.

Berichte

Wie sehen die Berichte aus?

Der Browser sendet Berichte an den von Ihnen konfigurierten Endpunkt. Es sendet Anfragen, die so aussehen:

POST
Content-Type: application/reports+json

Die Nutzlast dieser Anfragen ist eine Liste von Berichten.

Beispielliste der Berichte

[
 
{
   
"age": 420,
   
"body": {
     
"columnNumber": 12,
     
"disposition": "enforce",
     
"lineNumber": 11,
     
"message": "Document policy violation: document-write is not allowed in this document.",
     
"policyId": "document-write",
     
"sourceFile": "https://site.example/script.js"
   
},
   
"type": "document-policy-violation",
   
"url": "https://site.example/",
   
"user_agent": "Mozilla/5.0... Chrome/92.0.4504.0"
 
},
 
{
   
"age": 510,
   
"body": {
     
"blockedURL": "https://site.example/img.jpg",
     
"destination": "image",
     
"disposition": "enforce",
     
"type": "corp"
   
},
   
"type": "coep",
   
"url": "https://dummy.example/",
   
"user_agent": "Mozilla/5.0... Chrome/92.0.4504.0"
 
}
]

In diesen Berichten finden Sie folgende Daten:

Feld Beschreibung
age Die Anzahl der Millisekunden zwischen dem Zeitstempel des Berichts und der aktuellen Zeit.
body Die eigentlichen Berichtsdaten, serialisiert in einen JSON-String. Die Felder in der body eines Berichts werden durch die type des Berichts bestimmt. ⚠️ Berichte verschiedener Typen haben unterschiedliche Textkörper. Den genauen Inhalt der einzelnen Berichtstypen finden Sie im Demo-Endpunkt für Berichte . Folgen Sie der Anleitung, um Beispielberichte zu generieren.
type Ein Berichtstyp, z. B. csp-violation oder coep.
url Die Adresse des Dokuments oder Workers, aus dem der Bericht generiert wurde. Sensible Daten wie Nutzername, Passwort und Fragment werden aus dieser URL entfernt.
user_agent Der User-Agent-Header der Anfrage, aus der der Bericht generiert wurde.

Berichte mit Anmeldedaten

Berichtsendpunkte, die dieselbe Quelle wie die Seite haben, auf der der Bericht generiert wird, erhalten die Anmeldedaten (Cookies) in den Anfragen, die die Berichte enthalten.

Anmeldedaten können nützlichen zusätzlichen Kontext zum Bericht liefern, z. B. ob durch das Konto eines bestimmten Nutzers immer wieder Fehler ausgelöst werden oder ob eine bestimmte Abfolge von Aktionen, die auf anderen Seiten ausgeführt werden, einen Bericht auf dieser Seite auslöst.

Wann und wie sendet der Browser Berichte?

Berichte werden außerhalb des Bandes von Ihrer Website gesendet: Der Browser steuert, wann sie an die konfigurierten Endpunkte gesendet werden. Außerdem können Sie nicht festlegen, wann der Browser Berichte sendet. Er erfasst, stellt sie in die Warteschlange und sendet sie automatisch zu einem geeigneten Zeitpunkt.

Das bedeutet, dass bei der Verwendung der Reporting API kaum bis gar keine Leistungsprobleme auftreten.

Berichte werden mit einer Verzögerung von bis zu einer Minute gesendet, um die Wahrscheinlichkeit zu erhöhen, dass Berichte in Batches gesendet werden. So wird die Bandbreite geschont, um die Netzwerkverbindung des Nutzers zu schonen. Das ist besonders auf Mobilgeräten wichtig. Der Browser kann die Übermittlung auch verzögern, wenn er gerade Aufgaben mit höherer Priorität verarbeitet oder sich der Nutzer gerade in einem langsamen und/oder überlasteten Netzwerk befindet.

Drittanbieter- und eigene Probleme

Berichte, die aufgrund von Verstößen oder Einstellung von Funktionen auf Ihrer Seite generiert werden, werden an die von Ihnen konfigurierten Endpunkte gesendet. Dazu gehören auch Verstöße durch Drittanbieter-Skripts, die auf Ihrer Seite ausgeführt werden.

Verstöße oder Einstellungsankündigungen, die in einem in Ihre Seite eingebetteten, plattformübergreifenden Iframe auftreten, werden nicht an Ihre Endpunkte gesendet (zumindest nicht standardmäßig). Ein iFrame könnte eigene Berichte einrichten und sogar Berichte an den Berichtsdienst Ihrer Website, also den Erstanbieter-Berichtsdienst, erstellen, aber das liegt an der geframeten Website. Außerdem werden die meisten Meldungen nur generiert, wenn gegen die Richtlinien einer Seite verstoßen wird. Die Richtlinien Ihrer Seite und die des Iframes können sich unterscheiden.

Beispiel mit eingestellten Funktionen

Wenn die Überschrift „Reporting Endpoints“ auf Ihrer Seite eingerichtet ist: Einstellungsberichte zu APIs, die von Drittanbieter-Scripts auf Ihrer Seite aufgerufen werden, werden an Ihren Endpunkt gesendet. Verworfene APIs, die über einen in Ihre Seite eingebetteten Iframe aufgerufen werden, werden nicht an Ihren Endpunkt gesendet. Ein Bericht zur Einstellung wird nur generiert, wenn der Iframe-Server Berichtsendpunkte eingerichtet hat. Dieser Bericht wird an den vom Server des Iframes eingerichteten Endpunkt gesendet.
Wenn die Überschrift „Reporting Endpoints“ auf Ihrer Seite eingerichtet ist: Einstellungsberichte zu APIs, die von Drittanbieter-Scripts auf Ihrer Seite aufgerufen werden, werden an Ihren Endpunkt gesendet. Verworfene APIs, die über einen in Ihre Seite eingebetteten Iframe aufgerufen werden, werden nicht an Ihren Endpunkt gesendet. Ein Einstellungsbericht wird nur erstellt, wenn auf dem iFrame-Server Berichterstellungs-Endpunkte eingerichtet sind. Dieser Bericht wird an den vom iFrame-Server eingerichteten Endpunkt gesendet.

Unterstützte Browser

In der folgenden Tabelle wird die Browserunterstützung für die Reporting API Version 1 zusammengefasst, d. h. für den Header Reporting-Endpoints. Die Browserunterstützung für die Reporting API v0 (Report-To-Header) ist mit Ausnahme eines Berichtstyps identisch: Das Logging von Netzwerkfehlern wird in der neuen Reporting API nicht unterstützt. Weitere Informationen finden Sie im Migrationsleitfaden.

Berichtstyp Chrome Chrome iOS Safari Firefox Edge
CSP-Verstoß (nur Level 3)* ✔ Ja ✔ Ja ✔ Ja ✘ Nein ✔ Ja
Netzwerkfehler-Logging ✘ Nein ✘ Nein ✘ Nein ✘ Nein ✘ Nein
Verstoß gegen COOP-/COEP-Bestimmungen ✔ Ja ✘ Nein ✔ Ja ✘ Nein ✔ Ja
Alle anderen Typen: Verstoß gegen die Dokumentrichtlinie, Einstellung, Intervention, Absturz ✔ Ja ✘ Nein ✘ Nein ✘ Nein ✔ Ja

In dieser Tabelle wird nur die Unterstützung von report-to mit dem neuen Reporting-Endpoints-Header zusammengefasst. Lesen Sie die Tipps zur Migration von CSP-Berichten, wenn Sie zu Reporting-Endpoints migrieren möchten.

Reporting API verwenden

Festlegen, wohin Berichte gesendet werden sollen

Es stehen zwei Optionen zur Verfügung:

  • Berichte an einen vorhandenen Berichtserfassungsdienst senden
  • Berichte an einen Berichts-Collector senden, den Sie selbst erstellen und betreiben.

Option 1: Vorhandenen Report Collector-Dienst verwenden

Beispiele für Report-Collector-Dienste:

Wenn du andere Lösungsmöglichkeiten kennst, kannst du uns das in diesem Beitrag melden. Wir werden diesen Beitrag dann aktualisieren.

Neben dem Preis sollten Sie bei der Auswahl eines Berichts-Collectors die folgenden Punkte berücksichtigen: 🧐

  • Unterstützt dieser Collector alle Berichtstypen? Beispielsweise unterstützen nicht alle Lösungen für Endpunkte für die Berichterstellung COOP-/COEP-Berichte.
  • Sind Sie damit einverstanden, dass die URLs Ihrer Anwendung an einen Drittanbieter weitergegeben werden, der Berichte erhebt? Auch wenn der Browser vertrauliche Informationen aus diesen URLs entfernt, können sie auf diese Weise preisgegeben werden. Wenn das für Ihre Anwendung zu riskant erscheint, können Sie einen eigenen Meldeendpunkt verwenden.

Option 2: Einen eigenen Report Collector erstellen und betreiben

Es ist nicht ganz einfach, einen eigenen Server zu erstellen, der Berichte empfängt. Als Erstes können Sie unsere schlanke Boilerplate abzweigen. Es wurde mit Express erstellt und kann Berichte empfangen und anzeigen.

  1. Rufen Sie den Berichts-Sammel-Code auf.

  2. Klicke auf Remix zum Bearbeiten, um das Projekt bearbeitbar zu machen.

  3. Sie haben jetzt Ihren Klon. Sie können ihn für Ihre eigenen Zwecke anpassen.

Wenn Sie die Vorlage nicht verwenden und Ihren eigenen Server von Grund auf neu erstellen:

  • Prüfen Sie auf POST-Anfragen mit einer Content-Type von application/reports+json, um Berichtsanfragen zu erkennen, die vom Browser an Ihren Endpunkt gesendet wurden.
  • Wenn sich Ihr Endpunkt an einem anderen Ursprung als Ihre Website befindet, muss er CORS-Preflight-Anfragen unterstützen.

Option 3: Option 1 und 2 kombinieren

Möglicherweise möchten Sie bestimmte Arten von Berichten von einem bestimmten Anbieter erstellen lassen, für andere aber eine interne Lösung verwenden.

Legen Sie in diesem Fall mehrere Endpunkte so fest:

Reporting-Endpoints: endpoint-1="https://reports-collector.example", endpoint-2="https://my-custom-endpoint.example"

Reporting-Endpoints-Header konfigurieren

Legen Sie einen Reporting-Endpoints-Antwortheader fest. Der Wert muss ein oder mehrere durch Kommas getrennte Schlüssel/Wert-Paare sein:

Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"

Wenn Sie von der bisherigen Reporting API zur neuen Reporting API migrieren, kann es sinnvoll sein, sowohl Reporting-Endpoints als auch Report-To festzulegen. Weitere Informationen finden Sie in der Migrationsanleitung. Insbesondere, wenn Sie Berichte zu Content-Security-Policy-Verstößen nur über die report-uri-Richtlinie verwenden, lesen Sie die Migrationsschritte für CSP-Berichte.

Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"
Report-To: ...

Schlüssel (Endpunktnamen)

Jeder Schlüssel kann einen beliebigen Namen haben, z. B. main-endpoint oder endpoint-1. Sie können unterschiedliche benannte Endpunkte für verschiedene Berichtstypen festlegen, z. B. my-coop-endpoint oder my-csp-endpoint. So können Sie Berichte je nach Typ an verschiedene Endpunkte weiterleiten.

Wenn Sie Berichte zu Eingriffen, Einstellungen und/oder Abstürzen erhalten möchten, legen Sie einen Endpunkt mit dem Namen default fest.

Wenn im Reporting-Endpoints-Header kein default-Endpunkt definiert ist, werden Berichte dieses Typs nicht gesendet, obwohl sie generiert werden.

Werte (URLs)

Jeder Wert ist eine URL Ihrer Wahl, an die die Berichte gesendet werden. Welche URL Sie hier festlegen, hängt davon ab, was Sie in Schritt 1 festgelegt haben.

Eine Endpunkt-URL:

Beispiele

Reporting-Endpoints: my-coop-endpoint="https://reports.example/coop", my-csp-endpoint="https://reports.example/csp", default="https://reports.example/default"

Sie können dann jeden benannten Endpunkt in der entsprechenden Richtlinie verwenden oder einen einzelnen Endpunkt für alle Richtlinien verwenden.

Wo kann ich den Header festlegen?

In der neuen Reporting API, die in diesem Artikel behandelt wird, sind Berichte auf Dokumente beschränkt. Das bedeutet, dass für einen bestimmten Ursprung verschiedene Dokumente wie site.example/page1 und site.example/page2 Berichte an unterschiedliche Endpunkte senden können.

Wenn Sie auf einer beliebigen Seite Ihrer Website Berichte über Verstöße oder Einstellungen erhalten möchten, legen Sie den Header in allen Antworten als Middleware fest.

Hier ein Beispiel in Express:

const REPORTING_ENDPOINT_BASE = 'https://report.example';
const REPORTING_ENDPOINT_MAIN = `${REPORTING_ENDPOINT_BASE}/main`;
const REPORTING_ENDPOINT_DEFAULT = `${REPORTING_ENDPOINT_BASE}/default`;

app
.use(function (request, response, next) {
 
// Set up the Reporting API
  response
.set(
   
'Reporting-Endpoints',
   
`main-endpoint="${REPORTING_ENDPOINT_MAIN}", default="${REPORTING_ENDPOINT_DEFAULT}"`,
 
);
 
next();
});

Richtlinien bearbeiten

Nachdem der Reporting-Endpoints-Header konfiguriert ist, fügen Sie jedem Richtlinienheader, für den Sie Berichte zu Verstößen erhalten möchten, eine report-to-Anweisung hinzu. Der Wert von report-to sollte einer der von Ihnen konfigurierten benannten Endpunkte sein.

Sie können den Endpunkt für mehrere Richtlinien oder unterschiedliche Endpunkte für verschiedene Richtlinien verwenden.

Für jede Richtlinie sollte der Wert für „report-to“ einer der von Ihnen konfigurierten benannten Endpunkte sein.

report-to wird für Einstellungs-, Eingriffs- und Absturzberichte nicht benötigt. Diese Berichte sind an keine Richtlinie gebunden. Sie werden generiert, solange ein default-Endpunkt eingerichtet ist, und an diesen default-Endpunkt gesendet werden.

Beispiel

# Content-Security-Policy violations and Document-Policy violations
# will be sent to main-endpoint
Content-Security-Policy: script-src 'self'; object-src 'none'; report-to main-endpoint;
Document-Policy: document-write=?0;report-to=main-endpoint;
# Deprecation reports don't need an explicit endpoint because
# these reports are always sent to the default endpoint

Beispielcode

Im Folgenden finden Sie ein Beispiel für einen Node-Server, der Express verwendet und alle in diesem Artikel beschriebenen Elemente vereint. Darin wird gezeigt, wie Sie die Berichterstellung für verschiedene Berichtstypen konfigurieren und die Ergebnisse anzeigen.

Berichtseinrichtung debuggen

Berichte absichtlich generieren

Wenn Sie die Reporting API einrichten, müssen Sie wahrscheinlich absichtlich gegen Ihre Richtlinien verstoßen, um zu prüfen, ob Berichte wie erwartet generiert und gesendet werden. In der Demo sehen Sie Beispielcode, der gegen Richtlinien verstößt und andere schädliche Aktionen ausführt, die Berichte aller Art generieren.

Zeit sparen

Es kann etwas dauern, bis Berichte gesendet werden. Das kann beim Debuggen lange dauern. 😴 Zum Glück können Sie beim Debuggen in Chrome das Flag --short-reporting-delay verwenden, um Berichte zu erhalten, sobald sie generiert wurden.

Führen Sie diesen Befehl in Ihrem Terminal aus, um dieses Flag zu aktivieren:

YOUR_PATH/TO/EXECUTABLE/Chrome --short-reporting-delay

Entwicklertools verwenden

Verwende in Chrome die Entwicklertools, um zu sehen, welche Berichte bereits gesendet wurden oder gesendet werden.

Diese Funktion befindet sich seit Oktober 2021 in der Testphase. So verwenden Sie die Funktion:

  1. Sie verwenden Chrome-Version 96 und höher (durch Eingabe von chrome://version in Ihren Browser).
  2. Geben Sie chrome://flags/#enable-experimental-web-platform-features in die URL-Leiste von Chrome ein oder fügen Sie sie ein.
  3. Klicken Sie auf Aktiviert.
  4. Starten Sie den Browser neu.
  5. Öffnen Sie die Chrome-Entwicklertools.
  6. Öffnen Sie in den Chrome-Entwicklertools die Einstellungen. Klicken Sie unter „Tests“ auf Bereich „Reporting API“ im Bereich „Anwendung“ aktivieren.
  7. Aktualisiere die Entwicklertools.
  8. Aktualisieren Sie die Seite. Berichte, die von der Seite generiert wurden, auf der die Entwicklertools geöffnet sind, werden im Bereich Anwendung der Chrome-Entwicklertools unter Reporting API aufgeführt.
Screenshot der DevTools mit den Berichten
Die Chrome-Entwicklertools zeigen die für deine Seite generierten Berichte und ihren Status an.

Berichtsstatus

In der Spalte Status sehen Sie, ob ein Bericht gesendet wurde.

Status Beschreibung
Success Der Browser hat den Bericht gesendet und der Endpunkt hat mit einem Erfolgscode geantwortet (200 oder ein anderer Erfolgscode 2xx).
Pending Der Browser versucht derzeit, den Bericht zu senden.
Queued Der Bericht wurde generiert und der Browser versucht derzeit nicht, ihn zu senden. Ein Bericht wird in einem der folgenden beiden Fälle als Queued angezeigt:
  • Der Bericht ist neu und der Browser wartet auf weitere Berichte, bevor er gesendet wird.
  • Der Bericht ist nicht neu. Der Browser hat bereits versucht, diesen Bericht zu senden, was fehlgeschlagen ist. Er wartet nun, bevor er es noch einmal versucht.
MarkedForRemoval Nach mehreren Versuchen (Queued) hat der Browser aufgehört, den Bericht zu senden, und wird ihn bald aus der Liste der zu sendenden Berichte entfernen.

Berichte werden nach einer Weile entfernt, unabhängig davon, ob sie gesendet wurden oder nicht.

Fehlerbehebung

Werden Berichte nicht wie erwartet erstellt oder an Ihren Endpunkt gesendet? Hier sind einige Tipps zur Fehlerbehebung:

Berichte werden nicht generiert

Die Berichte, die in den Entwicklertools angezeigt werden, wurden korrekt generiert. Wenn der erwartete Bericht nicht in dieser Liste angezeigt wird:

  • Setzen Sie in Ihren Richtlinien ein Häkchen bei report-to. Wenn dies falsch konfiguriert ist, wird kein Bericht generiert. Rufen Sie Richtlinien bearbeiten auf, um das Problem zu beheben. Sie können auch die DevTools-Konsole in Chrome prüfen: Wenn in der Konsole ein Fehler für den erwarteten Verstoß angezeigt wird, ist Ihre Richtlinie wahrscheinlich richtig konfiguriert.
  • In dieser Liste werden nur die Berichte angezeigt, die für das Dokument generiert wurden, in dem DevTools geöffnet ist. Beispiel: Wenn auf Ihrer Website site1.exampleein iFrame site2.example eingebettet ist, der gegen eine Richtlinie verstößt und daher einen Bericht generiert, wird dieser Bericht nur in den DevTools angezeigt, wenn Sie den iFrame in einem eigenen Fenster öffnen und die DevTools für dieses Fenster öffnen.

Berichte werden erstellt, aber nicht gesendet oder empfangen

Was ist, wenn Sie einen Bericht in DevTools sehen, er aber nicht an Ihren Endpunkt gesendet wird?

  • Verwenden Sie kurze Verzögerungen. Möglicherweise wird ein Bericht nicht angezeigt, weil er noch nicht gesendet wurde.
  • Prüfen Sie die Reporting-Endpoints-Headerkonfiguration. Wenn ein Problem vorliegt, wird ein korrekt erstellter Bericht nicht gesendet. In DevTools bleibt der Status des Berichts in diesem Fall Queued. Er kann bei einem Übermittlungsversuch zu Pending und dann schnell wieder zu Queued wechseln. Einige häufige Fehler, die zu diesem Problem führen können:

  • Der Endpunkt wird verwendet, aber nicht konfiguriert. Beispiel:

Code mit Fehler
 Document-Policy: document-write=?0;report-to=endpoint-1;
 
Reporting-Endpoints: default="https://reports.example/default"

Meldungen zu Verstößen gegen die Dokumentrichtlinie sollten an endpoint-1 gesendet werden, dieser Endpunktname ist aber nicht in Reporting-Endpoints konfiguriert.

  • Der default-Endpunkt fehlt. Einige Berichtstypen, z. B. Berichte zur Einstellung und zu Interventionen, werden nur an den Endpunkt default gesendet. Weitere Informationen finden Sie unter Header für Reporting-Endpunkte konfigurieren.

  • Achten Sie auf Probleme in der Syntax der Richtlinienüberschriften, z. B. auf fehlende Anführungszeichen. Details ansehen

  • Prüfen Sie, ob Ihr Endpunkt eingehende Anfragen verarbeiten kann.

    • Achten Sie darauf, dass Ihr Endpunkt CORS-Preflight-Anfragen unterstützt. Andernfalls können keine Meldungen empfangen werden.

    • Testen Sie das Verhalten Ihres Endpunkts. Anstatt Berichte manuell zu generieren, können Sie den Browser emulieren, indem Sie an Ihren Endpunkt Anfragen senden, die so aussehen, wie sie vom Browser gesendet würden. Führen Sie den folgenden Befehl aus:

    curl --header "Content-Type: application/reports+json" \
     
    --request POST \
     
    --data '[{"age":420,"body":{"columnNumber":12,"disposition":"enforce","lineNumber":11,"message":"Document policy violation: document-write is not allowed in this document.","policyId":"document-write","sourceFile":"https://dummy.example/script.js"},"type":"document-policy-violation","url":"https://dummy.example/","user_agent":"xxx"},{"age":510,"body":{"blockedURL":"https://dummy.example/img.jpg","destination":"image","disposition":"enforce","type":"corp"},"type":"coep","url":"https://dummy.example/","user_agent":"xxx"}]' \
      YOUR_ENDPOINT

    Der Endpunkt sollte mit einem Erfolgscode (200 oder einem anderen Erfolgscode 2xx) antworten. Andernfalls liegt ein Problem mit der Konfiguration vor.

Nur Berichterstellung

Die Richtlinienheader „-Report-Only“ und „Reporting-Endpoints“ arbeiten zusammen.

Für Endpunkte, die in Reporting-Endpoints konfiguriert und im Feld report-to von Content-Security-Policy, Cross-Origin-Embedder-Policy und Cross-Origin-Opener-Policy angegeben sind, werden Berichte gesendet, wenn diese Richtlinien verletzt werden.

In Reporting-Endpoints konfigurierte Endpunkte können auch im Feld report-to von Content-Security-Policy-Report-Only, Cross-Origin-Embedder-Policy-Report-Only und Cross-Origin-Opener-Policy-Report-Only angegeben werden. Sie erhalten auch Berichte, wenn gegen diese Richtlinien verstoßen wird.

Obwohl Berichte in beiden Fällen gesendet werden, erzwingen -Report-Only-Header die Richtlinien nicht: Es funktioniert nichts und es wird nichts blockiert. Sie erhalten aber Berichte darüber, was fehlerhaft oder blockiert worden wäre.

ReportingObserver

Mit der ReportingObserver JavaScript API können Sie clientseitige Warnungen beobachten.

Mit ReportingObserver und dem Header Reporting-Endpoints werden Berichte generiert, die gleich aussehen, aber leicht unterschiedliche Anwendungsfälle ermöglichen.

Verwenden Sie ReportingObserver, wenn:

  • Sie möchten nur Einstellungen und/oder Browsereingriffe im Blick behalten. ReportingObserver enthält clientseitige Warnungen wie Einstellungen und Browsereingriffe. Im Gegensatz zu Reporting-Endpoints werden hier jedoch keine anderen Arten von Berichten erfasst, z. B. Verstöße gegen CSP oder COOP/COEP.
  • Sie müssen auf diese Verstöße in Echtzeit reagieren. Mit ReportingObserver können Sie einem Verstoßereignis einen Callback hinzufügen.
  • Sie möchten einem Bericht über den benutzerdefinierten Callback zusätzliche Informationen hinzufügen, um die Fehlerbehebung zu erleichtern.

Ein weiterer Unterschied besteht darin, dass ReportingObserver nur clientseitig konfiguriert wird: Sie können ihn auch verwenden, wenn Sie keine Kontrolle über serverseitige Header haben und Reporting-Endpoints nicht festlegen können.

Weitere Informationen

Hero-Image von Nine Koepfer / @enka80 auf Unsplash, bearbeitet. Vielen Dank an Ian Clelland, Eiji Kitamura und Milica Mihajlija für ihre Rezensionen und Vorschläge zu diesem Artikel.