CSPViolationReportBody
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,则columnNumber和lineNumber都应具有非空值。 CSPViolationReportBody.statusCode只读-
一个数字,表示发生违规的文档或 worker 的 HTTP 状态码。
实例方法
还继承了其父接口 ReportBody 的方法。
CSPViolationReportBody.toJSON()已弃用-
一个序列化器,返回
CSPViolationReportBody对象的 JSON 表示。
示例
获取 CSPViolationReportBody 对象
要获取 CSPViolationReportBody 对象,您必须配置您的页面以触发 CSP 违规。在此示例中,我们将 CSP 设置为仅允许来自站点自身源的内容,然后尝试从 apis.google.com(一个外部源)加载脚本。
首先,我们在 HTTP 响应中设置 Content-Security-Policy 标头
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 # dictdef-cspviolationreportbody |
浏览器兼容性
加载中…