Spec-Zone.ru › Web APIs

CSPViolationReportBody

Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS), в некоторых или во всех поддерживающих браузерах.

Интерфейс CSPViolationReportBody — это расширение API отчётов, представляющее тело отчёта о нарушении Политики безопасности контента (CSP).

Нарушения CSP возникают, когда веб-страница пытается загрузить ресурс, который нарушает политику, установленную в Content-Security-Policy заголовке HTTP.

Отчёты о нарушениях CSP возвращаются в параметре reports обратного вызова ReportingObserver, имеющего type типа "csp-violation". Свойство body этих отчётов является экземпляром CSPViolationReportBody.

Отчёты о нарушениях CSP также могут отправляться в виде JSON-объектов на конечную точку, указанную в директиве политики report-to заголовка Content-Security-Policy. Эти отчёты аналогичным образом имеют type типа "csp-violation", и свойство body содержит сериализацию экземпляра этого интерфейса.

Примечание: Отчёты о нарушениях CSP, отправленные через API отчётов, когда конечная точка указана с помощью директивы CSP report-to, похожи (но не идентичны) JSON-объектам «отчёт CSP» JSON, отправляемым при указании конечных точек с помощью директивы report-uri. API отчётов и директива report-to предназначены для замены более старого формата отчётов и директивы report-uri.

ReportBody CSPViolationReportBody

Свойства экземпляра

Также наследует свойства от своего родительского интерфейса, ReportBody.

CSPViolationReportBody.blockedURL Только для чтения

Строка, представляющая тип или URL ресурса, который был заблокирован из-за нарушения CSP.

CSPViolationReportBody.columnNumber Только для чтения

Номер столбца в скрипте, где произошло нарушение.

CSPViolationReportBody.disposition Только для чтения

Указывает, как пользовательский агент обрабатывает нарушенную политику. Будет "enforce" или "report".

CSPViolationReportBody.documentURL Только для чтения

Строка, представляющая URL документа или работника, в котором было обнаружено нарушение.

CSPViolationReportBody.effectiveDirective Только для чтения

Строка, представляющая директиву, выполнение которой выявило нарушение.

CSPViolationReportBody.lineNumber Только для чтения

Номер строки в скрипте, где произошло нарушение.

CSPViolationReportBody.originalPolicy Только для чтения

Строка, содержащая политику, выполнение которой выявило нарушение.

CSPViolationReportBody.referrer Только для чтения

Строка, представляющая URL реферера ресурсов, политика которых была нарушена, или null.

CSPViolationReportBody.sample Только для чтения

Строка, представляющая образец ресурса, вызвавшего нарушение, обычно первые 40 символов. Будет заполняться только в случае встраиваемых скриптов, обработчиков событий или стилей — внешние ресурсы, вызывающие нарушение, не будут генерировать образец.

CSPViolationReportBody.sourceFile Только для чтения

Если нарушение произошло в результате выполнения скрипта, это будет URL скрипта; в противном случае — null. И columnNumber и lineNumber должны иметь ненулевые значения, если это свойство не null.

CSPViolationReportBody.statusCode Только для чтения

Число, представляющее HTTP-код состояния документа или работника, в котором произошло нарушение.

Методы экземпляра

Также наследует методы от своего родительского интерфейса, ReportBody.

CSPViolationReportBody.toJSON()

Сериализатор, возвращающий JSON-представление объекта CSPViolationReportBody.

Примеры

Получение объекта CSPViolationReportBody

Для получения объекта CSPViolationReportBody необходимо настроить страницу так, чтобы произошло нарушение CSP. В этом примере мы настроим CSP так, чтобы разрешать контент только из собственного источника, а затем попытаемся загрузить скрипт из apis.google.com, что является внешним источником.

Сначала настроим заголовок Content-Security-Policy в ответ HTTP:

Content-Security-Policy: default-src 'self';

или в элементе HTML <meta>:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'" />

Затем попытаемся загрузить внешний скрипт:

<!-- This should generate a CSP violation -->
<script src="https://apis.google.com/js/platform.js"></script>

Наконец, создадим новый объект ReportingObserver, чтобы прослушивать нарушения CSP (это необходимо загрузить из того же места, что и скрипт, вызывающий нарушение).

const observer = new ReportingObserver(
  (reports, observer) => {
    reports.forEach((violation) => {
      console.log(violation);
      console.log(JSON.stringify(violation));
    });
  },
  {
    types: ["csp-violation"],
    buffered: true,
  },
);

observer.observe();

Выше мы регистрируем каждый объект отчёта о нарушении и JSON-строковую версию объекта, которая может выглядеть подобно объекту ниже. Обратите внимание, что body является экземпляром CSPViolationReportBody, а type равно "csp-violation".

{
    "type": "csp-violation",
    "url": "http://127.0.0.1:9999/",
    "body": {
        "sourceFile": null,
        "lineNumber": null,
        "columnNumber": null,
        "documentURL": "http://127.0.0.1:9999/",
        "referrer": "",
        "blockedURL": "https://apis.google.com/js/platform.js",
        "effectiveDirective": "script-src-elem",
        "originalPolicy": "default-src 'self';",
        "sample": "",
        "disposition": "enforce",
        "statusCode": 200
    }
}

Отправка отчёта о нарушении CSP

Настройка веб-страницы для отправки отчёта о нарушении CSP аналогична предыдущему примеру. Как и прежде, необходимо настроить страницу так, чтобы возникло нарушение.

Кроме того, необходимо указать конечную точку(ки), куда будет отправляться отчёт. Сервер указывает конечные точки с помощью заголовка ответа Reporting-Endpoints: они должны быть безопасными URL (HTTPS). Затем директива CSP report-to используется для указания конкретной конечной точки для отчётов о нарушениях CSP:

Reporting-Endpoints: csp-endpoint="https://example.com/csp-report-to"
Content-Security-Policy: default-src 'self'; report-to csp-endpoint

Как и прежде, мы можем вызвать нарушение, загрузив внешний скрипт из места, которое не разрешено нашим заголовком CSP:

<!-- This should generate a CSP violation -->
<script src="https://apis.google.com/js/platform.js"></script>

Отчёт о нарушении затем будет отправлен на указанную конечную точку в виде JSON-файла. Как видно из примера ниже, type равно "csp-violation", а свойство body — сериализация объекта CSPViolationReportBody:

[
  {
    "age": 53531,
    "body": {
      "blockedURL": "inline",
      "columnNumber": 59,
      "disposition": "enforce",
      "documentURL": "https://example.com/csp-report-to",
      "effectiveDirective": "script-src-elem",
      "lineNumber": 1441,
      "originalPolicy": "default-src 'self'; report-to csp-endpoint",
      "referrer": "https://www.google.com/",
      "sample": "",
      "sourceFile": "https://example.com/csp-report-to",
      "statusCode": 200
    },
    "type": "csp-violation",
    "url": "https://example.com/csp-report-to",
    "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
  }
]

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

Спецификация
Политика безопасности контента уровня 3
# cspviolationreportbody

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

Рабочий стол Мобильный
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android
CSPViolationReportBody 74 79 130 56 предпросмотр 74 Нет 48 Нет 10.0 74
blockedURL 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
columnNumber 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
disposition 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
documentURL 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
effectiveDirective 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
lineNumber 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
originalPolicy 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
referrer 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
sample 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
sourceFile 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
statusCode 74 79 Нет 56 предпросмотр 74 Нет 48 Нет 10.0 74
toJSON 80 80 Нет 56 предпросмотр 80 Нет 48 Нет 10.0 80

См. также

  • ReportBody
  • ReportingObserver
  • Content-Security-Policy
  • SecurityPolicyViolationEvent

© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/CSPViolationReportBody

Spec-Zone.ru

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