CSP策略生效后怎么测试是否拦截了非法脚本?

博主怡彤 阅读 23

我在本地开发时加了 Content-Security-Policy,但不确定它有没有真的拦住外部脚本。比如我故意引入一个 CDN 的 JS,控制台没报错,但页面也没反应,到底是 CSP 拦了还是脚本本身有问题?

试过在 meta 标签里加 <meta http-equiv="Content-Security-Policy" content="default-src 'self'">,也试过在响应头里设置,但不知道怎么验证拦截是否生效。

有没有办法看到 CSP 具体阻止了哪些请求?或者强制让它在控制台打出拦截日志?

我来解答 赞 8 收藏
二维码
手机扫码查看
2 条解答
端木樱潼
浏览器自带的 DevTools 就能看,不用整那么复杂。

打开 Chrome DevTools,切换到 Console 面板,CSP 拦截的信息会直接显示在那里,格式大概是 "Refused to load script from 'xxx' because of Content-Security-Policy"。不过默认有时候会折叠,你得注意点开过滤选项,把 All、Warnings、Errors 都勾上。

还有个更直观的地方:Security 面板。在 DevTools 里找 Security 这一栏,点进去能看到页面用了什么 CSP、哪些资源被阻止了,一目了然。

如果你用的是 report-uri 或者 report-to 指令,可以在 CSP 头里加上 report-uri https://你的上报地址,这样违规请求会被发送到那个地址,你就能在服务器日志里看到详细的拦截记录。测试的时候特别好用,比如:

default-src 'self'; script-src 'self'; report-uri /csp-report

把 /csp-report 挂到 WordPress 的 admin-ajax.php 或者自定义 endpoint 上,就能收到 JSON 格式的违规报告。

至于你说的"控制台没报错但页面也没反应",这种情况通常是脚本被 CSP 静默拦截了。你去 Network 面板看看,那个请求的状态码是不是 (blocked:by:csp),如果是的话那就是 CSP 干的。

WP 里面有些插件会自己加 CSP 头,你要注意看下有没冲突。实在不确定就在当前页面的 DevTools 里直接看 Response Headers,看看 CSP 头的内容对不对。
点赞 1
2026-03-12 10:09
司空付娟
CSP 拦截是静默的,不会主动在控制台报错,所以你在控制台看不到任何红色Error这事儿确实坑爹。

最直接的办法是打开 Chrome DevTools,切换到 Security 面板,这里会明确标注哪个资源被 CSP 拦截了,以及原因。你也能在 Network 面板看请求状态,blocked by CSP 的请求状态栏会显示 (blocked by CSP)。

如果你想更主动地获取拦截日志,可以在 CSP 策略里加 report-uri 或者 report-to,把拦截报告发送到你的服务器。比如:

Content-Security-Policy: default-src 'self'; script-src 'self'; report-uri /csp-report


服务器端收到 POST 请求后就能看到完整的拦截详情,包括blocked-uri、document-uri、violated-directive 这些字段。

还有个土办法是在页面上放一个明显会被拦截的脚本,比如 ,然后去 Network 面板确认这个请求的状态是 (blocked by CSP) 还是 404。如果是前者就说明 CSP 生效了。

另外提醒一下,meta 标签设置 CSP 和响应头设置 CSP 在某些浏览器行为不太一样,有些浏览器会忽略 meta 标签的 report-uri。建议优先用响应头方式。
点赞
2026-03-11 04:01