Content-Security-Policy-Report-Only

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since August 2016.

HTTP **Content-Security-Policy-Report-Only**响应头允许 web 开发人员通过监测 (但不强制执行) 政策的影响来尝试政策。这些违反报告由 JSON 文档组成通过一个 HTTP POST 请求发送到指定的 URI。

更多相关信息,可参见这篇文章 Content Security Policy (CSP).

Header 类型 Response header
Forbidden header name no
这个 header 不支持在 <meta> 元素内(定义)。

语法

Content-Security-Policy-Report-Only: <policy-directive>; <policy-directive>

指令

Content-Security-Policy header 的指令也可应用于 Content-Security-Policy-Report-Only.

CSP report-uri 指令需要跟这个 header 一起用,否则这个 header 将会是一个昂贵却无操作 (无作用) 的机器 (设置)。

例子

这个 header 报告 (统计) 将会发生的违规行为。你可以使用这个 header 去迭代你的内容安全政策。你观察你的网站的行为,查看违反报告,然后通过 Content-Security-Policy 头选择所需的政策。

Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-endpoint/

如果你希望收到报告,而且还想执行一项策略,使用Content-Security-Policy 头跟report-uri 指令。

Content-Security-Policy: default-src https:; report-uri /csp-violation-report-endpoint/

违规报告的语法

报告的 JSON 对象包括下面的数据:

document-uri

发生违规的文档 URI。

referrer

发生违规的文档 referrer。

blocked-uri

被内容安全政策阻塞加载的资源的 URI。如果被阻塞的 URI 与文档 URI 不同源,则被阻塞的 URI 被截断为只包含 scheme(协议),host(域名),和 port(端口)。

violated-directive

被违反的策略名。

original-policy

Content-Security-Policy HTTP 头部所指定的原始策略。

disposition

“执行”或“报告”取决于是使用Content-Security-Policy 头还是使用 Content-Security-Header-Report-Only 头。

违规报告样例

思考一下一个地址为 http://example.com/signup.html 的页面。它使用了下面的策略,禁止除了来自 cdn.example.com 的样式表外的其他任何资源。

http
Content-Security-Policy-Report-Only: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports

signup.html的 html 如下:

html
<!doctype html>
<html>
  <head>
    <title>Sign Up</title>
    <link rel="stylesheet" href="css/style.css" />
  </head>
  <body>
    ... Content ...
  </body>
</html>

你可以发现违规的地方吗?只允许加载来自cdn.example.com 这个域名的样式表,然而这个网站试着加载来自自己域名的样式表 (http://example.com)。当文档被访问时,可以执行 CSP(内容安全策略) 的浏览器将会用 POST 请求发送以下违规报告到http://example.com/_/csp-reports:

js
{
  "csp-report": {
    "document-uri": "http://example.com/signup.html",
    "referrer": "",
    "blocked-uri": "http://example.com/css/style.css",
    "violated-directive": "style-src cdn.example.com",
    "original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports",
    "disposition": "report"
  }
}

正如你所看到的,报告在blocked-uri 上记录了违反资源的完整路径。这并非总是如此。例如,当 signup.html 试图从 http://anothercdn.example.com/stylesheet.css 加载CSS,浏览器不会包含完整路径,只包含来源。这样做是为了防止泄漏跨域资源的敏感信息。

规范

Specification
Content Security Policy Level 3
# cspro-header

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobile
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Content-Security-Policy-Report-Only

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

参见