CSPViolationReportBody
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.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
,则columnNumber
和lineNumber
应具有非空值。 CSPViolationReportBody.statusCode
只读-
表示发生违规的文档或工作程序的 HTTP 状态代码的数字。
实例方法
还继承了其父接口ReportBody
的方法。
CSPViolationReportBody.toJSON()
-
一个序列化器,它返回
CSPViolationReportBody
对象的 JSON 表示形式。
示例
获取 CSPViolationReportBody
对象
要获取 CSPViolationReportBody
对象,您必须配置页面以使 CSP 违规发生。在此示例中,我们将 CSP 设置为仅允许来自站点自身来源的内容,然后尝试从 apis.google.com
加载脚本,这是一个外部来源。
首先,我们将设置我们的Content-Security-Policy
标头
Content-Security-Policy: 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) => {
const cspViolation = reports[0];
},
{
types: ["csp-violation"],
buffered: true,
},
);
observer.observe();
如果我们要记录违规报告对象,它看起来类似于下面的对象。请注意,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": "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 的浏览器中加载。