CSPViolationReportBody

安全上下文:此功能仅在安全上下文(HTTPS)中可用,在某些或所有支持的浏览器中可用。

CSPViolationReportBody 接口是Reporting API的扩展,表示内容安全策略 (CSP) 违规报告的主体。

当网页尝试加载违反Content-Security-Policy HTTP 标头设置的策略的资源时,会引发 CSP 违规。

CSP 违规报告在reports参数中返回,该参数是类型为 "csp-violation"ReportingObserver 回调函数。这些报告的 body 属性是 CSPViolationReportBody 的实例。

CSP 违规报告也可以作为 JSON 对象发送到report-to策略指令中指定的端点Content-Security-Policy标头。这些报告也类似地具有 "csp-violation"type 和一个 body 属性,该属性包含此接口实例的序列化。

注意:当使用 CSP report-to 指令指定端点时,Reporting API 发送的 CSP 违规报告类似于(但并不完全相同)“CSP 报告”JSON 对象,这些对象是在使用report-uri指令指定端点时发送的。Reporting API 和 report-to 指令旨在替换旧的报告格式和 report-uri 指令。

ReportBody CSPViolationReportBody

实例属性

还继承了其父接口ReportBody的属性。

CSPViolationReportBody.blockedURL 只读

表示由于违反 CSP 而被阻止的资源的 URL 的字符串。

CSPViolationReportBody.columnNumber 只读

发生违规的脚本中的列号。

CSPViolationReportBody.disposition 只读

指示用户代理如何配置违反的策略。这将是 "enforce""report"

CSPViolationReportBody.documentURL 只读

表示在其中发现违规的文档或工作程序的 URL 的字符串。

CSPViolationReportBody.effectiveDirective 只读

表示发现违规的指令的字符串。

CSPViolationReportBody.lineNumber 只读

发生违规的脚本中的行号。

CSPViolationReportBody.originalPolicy 只读

包含发现违规的策略的字符串。

CSPViolationReportBody.referrer 只读

表示违反策略的资源的引荐来源网址的字符串,或 null

CSPViolationReportBody.sample 只读

表示导致违规的资源样本的字符串,通常是前 40 个字符。这仅在资源是内联脚本、事件处理程序或样式时才会填充——导致违规的外部资源不会生成样本。

CSPViolationReportBody.sourceFile 只读

如果违规是由于脚本导致的,则此属性将是脚本的 URL;否则,它将是 null。如果此属性不是 null,则 columnNumberlineNumber 应具有非空值。

CSPViolationReportBody.statusCode 只读

表示发生违规的文档或工作程序的 HTTP 状态代码的数字。

实例方法

还继承了其父接口ReportBody的方法。

CSPViolationReportBody.toJSON()

一个序列化器,它返回 CSPViolationReportBody 对象的 JSON 表示形式。

示例

获取 CSPViolationReportBody 对象

要获取 CSPViolationReportBody 对象,您必须配置页面以使 CSP 违规发生。在此示例中,我们将 CSP 设置为仅允许来自站点自身来源的内容,然后尝试从 apis.google.com 加载脚本,这是一个外部来源。

首先,我们将设置我们的Content-Security-Policy 标头

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

然后,我们将尝试加载外部脚本

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

最后,我们将创建一个新的ReportingObserver 对象来侦听 CSP 违规(这需要从同一位置加载,在导致违规的脚本之前)。

js
const observer = new ReportingObserver(
  (reports, observer) => {
    const cspViolation = reports[0];
  },
  {
    types: ["csp-violation"],
    buffered: true,
  },
);

observer.observe();

如果我们要记录违规报告对象,它看起来类似于下面的对象。请注意,bodyCSPViolationReportBody 的实例,type"csp-violation"

js
{
    "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 违规。

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

与之前一样,我们可以通过从 CSP 标头不允许的位置加载外部脚本来触发违规。

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

然后违规报告将作为 JSON 文件发送到指定的端点。从下面的示例中可以看出,type"csp-violation"body 属性是 CSPViolationReportBody 对象的序列化。

json
[
  {
    "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": "console.log(\"lo\")",
      "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

浏览器兼容性

BCD 表仅在启用了 JavaScript 的浏览器中加载。

另请参阅