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.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"
}
]
Спецификации
Совместимость с браузерами
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
См. также
© 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