Spec-Zone.ru › HTTP

Заголовки: 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);
}

Спецификации

Спецификация
Политика безопасности содержимого, уровень 3>
# directive-report-uri>

Совместимость с браузерами

Компьютеры Мобильные устройства
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

См. также

  • Content-Security-Policy
  • Content-Security-Policy-Report-Only
  • report-to

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API