CSP 的 report-to 指令怎么配置才能真正上报违规日志?

司徒广利 阅读 19

我在项目里加了 Content-Security-Policy,想用 report-to 把违规信息发到自己的接口,但试了好几次都没收到上报。是不是我配置错了?

这是我的响应头设置:

Content-Security-Policy: default-src 'self'; report-to csp-endpoint
Report-To: { "group": "csp-endpoint", "endpoints": [{ "url": "https://mydomain.com/csp-report" }], "include_subdomains": true }

浏览器控制台也没报错,但就是没看到任何请求发到 /csp-report,到底哪里出问题了?

我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
Tr° 增芳
你的配置有个关键问题:Report-To 头的格式不对。

问题分析

你的响应头是这样的:
Report-To: { "group": "csp-endpoint", "endpoints": [{ "url": "https://mydomain.com/csp-report" }], "include_subdomains": true }


但 Report-To 头它不是一个 JSON 对象,而是一个 JSON 数组。浏览器会把它当作字符串解析,根本不认。

正确的写法

把整个 JSON 用方括号包起来,变成数组:

Content-Security-Policy: default-src 'self'; report-to csp-endpoint
Report-To: [{"group": "csp-endpoint", "endpoints": [{"url": "https://mydomain.com/csp-report"}], "include_subdomains": true}]


注意几点:
- 最外层是方括号 [],不是花括号 {}
- 整个头是一个字符串值,不需要再套一层引号
- report-to csp-endpoint 这个指令的值要跟 group 名字对应上

顺带一说

如果你想兼容性更好,可以用 report-uri 代替,这是 CSP 1.0 就有的,浏览器支持更广:

Content-Security-Policy: default-src 'self'; report-uri https://mydomain.com/csp-report


这两个不冲突,可以同时写,浏览器会选自己支持的方式上报。

验证方法

配置改好之后,你得真的触发一个违规才能看到请求。比如在页面上加一个外链图片:

<img src="https://google.com/logo.png" />


因为 default-src 'self' 不允许加载外部图片,这就会触发一次 CSP 违规上报,浏览器会向你的 /csp-report 发送 POST 请求。

收到的 JSON 大概长这样:

{
"csp-report": {
"blocked-uri": "https://google.com",
"violated-directive": "default-src 'self'",
"document-uri": "https://mydomain.com/page",
"original-policy": "default-src 'self'; report-to csp-endpoint"
}
}


常见坑再提一下

1. 接口必须是 HTTPS,除非你是 localhost
2. 接口要返回 2xx,不然浏览器当发送失败
3. 某些浏览器(比如 Safari)对 report-to 支持不太好,用 report-uri 更稳

你先改一下 Report-To 头试试,应该就能收到了。
点赞
2026-03-11 21:00