Заголовки: CSP.report-uri
Content-Security-Policy: директива report-uri
Устарело: Эта функция больше не рекомендуется. Хотя некоторые браузеры всё ещё могут её поддерживать, она уже могла быть удалена из соответствующих веб-стандартов, может находиться в процессе удаления или сохраняться только для обеспечения совместимости. Не используйте её и, если возможно, обновите существующий код; чтобы принять решение, см. таблицу совместимости внизу этой страницы. Имейте в виду, что эта функция может перестать работать в любой момент.
Предупреждение: Директива report-to предназначена для замены report-uri, а в браузерах, поддерживающих report-to, директива report-uri игнорируется.
Однако, пока report-to не получит широкую поддержку, можно указать оба заголовка, как показано ниже:
Content-Security-Policy: …; report-uri https://endpoint.example.com; report-to endpoint_name
Устаревшая директива HTTP Content-Security-Policy (CSP) report-uri указывает пользовательскому агенту сообщать о попытках нарушить политику безопасности содержимого. Эти отчёты о нарушениях представляют собой документы JSON, отправляемые с помощью HTTP-запроса POST на указанный URI.
Сама по себе директива не оказывает никакого эффекта и приобретает смысл только в сочетании с другими директивами.
| Версия CSP | 1 |
|---|---|
| Тип директивы | Директива отчётности |
Эта директива не поддерживается в элементе <meta>. | |
Синтаксис
Content-Security-Policy: report-uri <uri>; Content-Security-Policy: report-uri <uri> <uri>;
- <uri>
-
URI, на который необходимо отправить отчёт.
Синтаксис отчёта о нарушении
Объект отчёта JSON отправляется с помощью HTTP-операции POST с типом Content-Type application/csp-report.
Примечание: Отчёты о нарушениях следует считать данными, контролируемыми злоумышленником. Перед сохранением или отображением содержимое необходимо надлежащим образом очистить. Это особенно важно для свойства script-sample, если оно указано.
Объект отчёта JSON содержит одно свойство верхнего уровня, "csp-report", в котором находится объект со следующими свойствами:
blocked-uri-
URI ресурса, загрузка которого была заблокирована политикой безопасности содержимого. Если заблокированный URI имеет источник, отличный от источника
document-uri, то он усекается и содержит только схему, хост и порт. disposition-
Значение
"enforce"или"report", в зависимости от того, используется ли заголовокContent-Security-Policy-Report-Onlyили заголовокContent-Security-Policy. document-uri-
URI документа, в котором произошло нарушение.
effective-directive-
Директива, применение которой привело к нарушению. Некоторые браузеры могут предоставлять другие значения: например, Chrome может указывать
style-src-elem/style-src-attr, даже если применялась директиваstyle-src. original-policy-
Исходная политика, заданная заголовком HTTP
Content-Security-Policy. referrer-
Реферер документа, в котором произошло нарушение.
script-sample-
Первые 40 символов встроенного скрипта, обработчика событий или стиля, вызвавшего нарушение. Нарушения, источником которых являются внешние файлы, в отчёт не включаются.
Это свойство применимо только к нарушениям
script-src*иstyle-src*, если соответствующая директиваContent-Security-Policyсодержит ключевое слово'report-sample'. status-code-
Код состояния HTTP ресурса, для которого был создан глобальный объект.
violated-directive-
Директива, применение которой привело к нарушению.
violated-directive— историческое название поляeffective-directive; оно содержит то же значение.
Примеры
>Отчёт о нарушении CSP с Content-Security-Policy
Рассмотрим страницу, расположенную по адресу http://example.com/signup.html. На ней используется следующая политика, запрещающая всё, кроме таблиц стилей, загружаемых с cdn.example.com.
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
HTML-код signup.html выглядит так:
<!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>
Заметили ошибку? Загружать таблицы стилей разрешено только с cdn.example.com, однако сайт пытается загрузить таблицу стилей со своего источника (http://example.com). Браузер, способный применять CSP, при посещении документа отправит следующий отчёт о нарушении в виде запроса POST на http://example.com/_/csp-reports:
{
"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"
}
}
Как видно, отчёт содержит полный путь к ресурсу, вызвавшему нарушение, в blocked-uri. Так бывает не всегда. Например, если signup.html попытается загрузить CSS с http://anothercdn.example.com/stylesheet.css, браузер не укажет полный путь, а укажет только источник (http://anothercdn.example.com), чтобы предотвратить утечку конфиденциальных сведений о ресурсах из другого источника. В спецификации CSP объясняется это поведение.
Отчёт о нарушении CSP с Content-Security-Policy-Report-Only
Директиву report-uri также можно использовать с заголовком ответа Content-Security-Policy-Report-Only. Этот заголовок позволяет браузеру сообщать о нарушениях, но не блокировать их во время тестирования.
Заголовок HTTP будет почти таким же.
Content-Security-Policy-Report-Only: default-src 'none'; style-src cdn.example.com; report-to /_/csp-reports
Отчёт будет таким же, за исключением значения disposition "report" и, конечно же, "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
Предположим, сервер отправляет ответы со следующим заголовком Content-Security-Policy:
Content-Security-Policy: default-src https:; report-uri /csp-violation-report-endpoint/
Например, /csp-violation-report-endpoint/ может запустить PHP-скрипт, подобный приведённому ниже: он записывает в журнал JSON с подробностями нарушения и, если это первое нарушение, добавленное в файл журнала, отправляет электронное письмо администратору:
<?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);
}
Спецификации
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari для iOS | Samsung Internet | WebView для Android | WebView для iOS | |
report-uri |
25 | 14 | 23 | 15 | 7 | 25 | 23 | 14 | 7 | 1.5 | 4.4 | 7 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy/report-uri