CSPViolationReportBody

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

CSPViolationReportBody 接口是 Reporting API 的一个扩展,用于表示内容安全策略 (CSP) 违规报告的正文。

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

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

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

注意: 当使用 CSP report-to 指令指定端点时,Reporting API 发送的 CSP 违规报告与使用 report-uri 指令指定端点时发送的 "CSP 报告" JSON 对象 相似(但不完全相同)。Reporting API 和 report-to 指令旨在取代旧的报告格式和 report-uri 指令。

实例属性

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

CSPViolationReportBody.blockedURL 只读

一个字符串,表示因违反 CSP 而被阻止的资源的类型或 URL。

CSPViolationReportBody.columnNumber 只读

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

CSPViolationReportBody.disposition 只读

指示用户代理如何处理违规策略。将是 "enforce"(强制执行)或 "report"(仅报告)。

CSPViolationReportBody.documentURL 只读

一个字符串,表示发现违规的文档或 worker 的 URL。

CSPViolationReportBody.effectiveDirective 只读

一个字符串,表示揭示了违规的指令。

CSPViolationReportBody.lineNumber 只读

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

CSPViolationReportBody.originalPolicy 只读

一个字符串,包含揭示了违规的策略。

CSPViolationReportBody.referrer 只读

一个字符串,表示策略被违反的资源的引荐来源 URL,或者为 null

CSPViolationReportBody.sample 只读

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

CSPViolationReportBody.sourceFile 只读

如果违规是由脚本引起的,则此属性为脚本的 URL;否则为 null。如果此属性不是 null,则 columnNumberlineNumber 都应具有非空值。

CSPViolationReportBody.statusCode 只读

一个数字,表示发生违规的文档或 worker 的 HTTP 状态码。

实例方法

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

CSPViolationReportBody.toJSON() 已弃用

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

示例

获取 CSPViolationReportBody 对象

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

首先,我们在 HTTP 响应中设置 Content-Security-Policy 标头

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

或在 HTML <meta> 元素中

html
<meta http-equiv="Content-Security-Policy" content="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) => {
    reports.forEach((violation) => {
      console.log(violation);
      console.log(JSON.stringify(violation));
    });
  },
  {
    types: ["csp-violation"],
    buffered: true,
  },
);

observer.observe();

上面我们记录了每个违规报告对象以及对象的 JSON 字符串版本,它可能看起来像下面的对象。请注意,bodyCSPViolationReportBody 的一个实例,而 type"csp-violation"

json
{
  "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": "",
      "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
# dictdef-cspviolationreportbody

浏览器兼容性

另见