Content-Security-Policy: report-uri Direktive
Veraltet: Diese Funktion wird nicht mehr empfohlen. Obwohl einige Browser sie möglicherweise noch unterstützen, könnte sie bereits aus den relevanten Webstandards entfernt worden sein, in Kürze entfernt werden oder nur noch aus Kompatibilitätsgründen bestehen. Vermeiden Sie die Verwendung und aktualisieren Sie vorhandenen Code, falls möglich; siehe die Kompatibilitätstabelle am Ende dieser Seite, um Ihre Entscheidung zu unterstützen. Beachten Sie, dass diese Funktion jederzeit aufhören könnte zu funktionieren.
Warnung:
Die report-to
Direktive soll report-uri
ersetzen, und in Browsern, die report-to
unterstützen, wird die report-uri
Direktive ignoriert.
Bis report-to
jedoch umfassend unterstützt wird, können Sie beide Header wie gezeigt angeben:
Content-Security-Policy: …; report-uri https://endpoint.example.com; report-to endpoint_name
Die veraltete HTTP Content-Security-Policy
(CSP) report-uri
Direktive weist den User-Agent an, Versuche zur Verletzung der Content Security Policy zu melden.
Diese Verletzungsberichte bestehen aus JSON-Dokumenten, die über eine HTTP POST
-Anfrage an die angegebene URI gesendet werden.
Die Direktive hat an sich keine Wirkung, sondern erhält nur in Kombination mit anderen Direktiven Bedeutung.
CSP-Version | 1 |
---|---|
Direktiventyp | Reporting-Direktive |
Diese Direktive wird im <meta> Element nicht unterstützt.
|
Syntax
Content-Security-Policy: report-uri <uri>;
Content-Security-Policy: report-uri <uri> <uri>;
- <uri>
-
Eine URI, die angibt, wohin der Bericht gesendet werden muss.
Syntax des Verletzungsberichts
Das JSON-Objekt des Berichts wird mit einer HTTP POST
-Operation und einem Content-Type
von application/csp-report
gesendet.
Hinweis: Verletzungsberichte sollten als Angreifer-kontrollierte Daten betrachtet werden. Der Inhalt sollte vor dem Speichern oder Darstellen ordnungsgemäß bereinigt werden. Dies gilt insbesondere für die script-sample-Eigenschaft, falls sie bereitgestellt wird.
Das JSON-Objekt des Berichts hat eine einzelne Eigenschaft auf oberster Ebene, "csp-report"
, die ein Objekt mit den folgenden Eigenschaften enthält:
blocked-uri
-
Die URI der Ressource, die durch die Content Security Policy am Laden gehindert wurde. Wenn die blockierte URI von einer anderen Herkunft als die
document-uri
stammt, wird die blockierte URI gekürzt, um nur das Schema, den Host und den Port zu enthalten. disposition
-
Entweder
"enforce"
oder"report"
je nachdem, ob derContent-Security-Policy-Report-Only
Header oder derContent-Security-Policy
Header verwendet wird. document-uri
-
Die URI des Dokuments, in dem die Verletzung aufgetreten ist.
effective-directive
-
Die Direktive, deren Durchsetzung die Verletzung verursacht hat. Einige Browser können unterschiedliche Werte bereitstellen, wie z.B. Chrome, das
style-src-elem
/style-src-attr
bereitstellt, selbst wenn die durchgesetzte Direktivestyle-src
war. original-policy
-
Die ursprünglich von dem
Content-Security-Policy
HTTP-Header festgelegte Richtlinie. referrer
Veraltet Nicht standardisiert-
Der Referrer des Dokuments, in dem die Verletzung aufgetreten ist.
script-sample
-
Die ersten 40 Zeichen des eingebetteten Skripts, des Ereignis-Handlers oder des Stils, der die Verletzung verursacht hat. Verletzungen, die von externen Dateien stammen, werden im Bericht nicht aufgenommen.
Dies ist nur anwendbar auf
script-src*
undstyle-src*
Verletzungen, wenn die entsprechendeContent-Security-Policy
Direktive das'report-sample'
Schlüsselwort enthält. status-code
-
Der HTTP-Statuscode der Ressource, auf der das globale Objekt erstellt wurde.
violated-directive
Veraltet-
Die Direktive, deren Durchsetzung die Verletzung verursacht hat. Die
violated-directive
ist ein historischer Name für das Feldeffective-directive
und enthält denselben Wert.
Beispiele
CSP-Verletzungsbericht mit Content-Security-Policy
Betrachten wir eine Seite unter http://example.com/signup.html
.
Sie verwendet die folgende Richtlinie, die alles außer Stylesheets, die von cdn.example.com
geladen werden, verbietet.
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
Das HTML von signup.html
sieht so aus:
<!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<title>Sign Up</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
Here be content.
</body>
</html>
Sehen Sie den Fehler? Stylesheets dürfen nur von cdn.example.com
geladen werden, dennoch versucht die Website, eines von ihrem eigenen Ursprung (http://example.com
) zu laden.
Ein Browser, der in der Lage ist, CSP durchzusetzen, würde den folgenden Verletzungsbericht als POST
-Anfrage an http://example.com/_/csp-reports
senden, wenn das Dokument besucht wird:
{
"csp-report": {
"blocked-uri": "http://example.com/css/style.css",
"disposition": "report",
"document-uri": "http://example.com/signup.html",
"effective-directive": "style-src-elem",
"original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports",
"referrer": "",
"status-code": 200,
"violated-directive": "style-src-elem"
}
}
Wie Sie sehen können, enthält der Bericht den vollständigen Pfad zur verletzenden Ressource in blocked-uri
.
Das ist nicht immer der Fall.
Wenn signup.html
beispielsweise versuchen würde, CSS von http://anothercdn.example.com/stylesheet.css
zu laden, würde der Browser nicht den vollständigen Pfad aufnehmen, sondern nur den Ursprung,
(http://anothercdn.example.com
) um zu verhindern, dass sensible Informationen über Ressourcen fremder Herkunft preisgegeben werden.
Die CSP-Spezifikation gibt eine Erklärung für dieses Verhalten.
CSP-Verletzungsbericht mit Content-Security-Policy-Report-Only
Die report-uri
Direktive kann auch mit dem Content-Security-Policy-Report-Only
Antwortheader verwendet werden.
Dieser Header ermöglicht dem Browser zu berichten, aber nicht bei Verstößen zu blockieren, wenn getestet wird.
Der HTTP-Header wäre nahezu identisch.
Content-Security-Policy-Report-Only: default-src 'none'; style-src cdn.example.com; report-to /_/csp-reports
Der Bericht wäre derselbe, mit Ausnahme der Angabe "report"
und natürlich der "original-policy"
:
{
"csp-report": {
"blocked-uri": "http://example.com/css/style.css",
"disposition": "report",
"document-uri": "http://example.com/signup.html",
"effective-directive": "style-src-elem",
"original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports",
"referrer": "",
"status-code": 200,
"violated-directive": "style-src-elem"
}
}
CSP-Verletzungsprotokollierung
Angenommen ein Server sendet Antworten mit dem folgenden Content-Security-Policy
Header:
Content-Security-Policy: default-src https:; report-uri /csp-violation-report-endpoint/
/csp-violation-report-endpoint/
könnte zum Beispiel ein PHP-Skript wie das folgende ausführen, dass das JSON, das die Verletzung beschreibt, protokolliert und, wenn die Verletzung die erste ist, die der Protokolldatei hinzugefügt wird, eine E-Mail an einen Administrator sendet:
<?php
// Start configure
$log_file = dirname(__FILE__) . "/csp-violations.log";
$log_file_size_limit = 1000000; // bytes - once exceeded no further entries are added
$email_address = "admin@example.com";
$email_subject = "Content-Security-Policy violation";
// End configuration
$current_domain = preg_replace("/www\./i", "", $_SERVER["SERVER_NAME"]);
$email_subject = $email_subject . " on " . $current_domain;
http_response_code(204); // HTTP 204 No Content
$json_data = file_get_contents("php://input");
// We pretty print the JSON before adding it to the log file
if (($json_data = json_decode($json_data))) {
$json_data = json_encode(
$json_data,
JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES,
);
if (!file_exists($log_file)) {
// Send an email
$message =
"The following Content-Security-Policy violation occurred on " .
$current_domain . ":\n\n" .
$json_data .
"\n\nFurther CPS violations will be logged to the following log file, but no further email notifications will be sent until this log file is deleted:\n\n" .
$log_file;
mail(
$email_address,
$email_subject,
$message,
"Content-Type: text/plain;charset=utf-8",
);
} else if (filesize($log_file) > $log_file_size_limit) {
exit(0);
}
file_put_contents($log_file, $json_data, FILE_APPEND | LOCK_EX);
}
Spezifikationen
Specification |
---|
Content Security Policy Level 3 # directive-report-uri |