我在本地开发时加了 Content-Security-Policy,但不确定它有没有真的拦住外部脚本。比如我故意引入一个 CDN 的 JS,控制台没报错,但页面也没反应,到底是 CSP 拦了还是脚本本身有问题?
试过在 meta 标签里加 <meta http-equiv="Content-Security-Policy" content="default-src 'self'">,也试过在响应头里设置,但不知道怎么验证拦截是否生效。
有没有办法看到 CSP 具体阻止了哪些请求?或者强制让它在控制台打出拦截日志?
打开 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 头的内容对不对。
最直接的办法是打开 Chrome DevTools,切换到 Security 面板,这里会明确标注哪个资源被 CSP 拦截了,以及原因。你也能在 Network 面板看请求状态,blocked by CSP 的请求状态栏会显示 (blocked by CSP)。
如果你想更主动地获取拦截日志,可以在 CSP 策略里加 report-uri 或者 report-to,把拦截报告发送到你的服务器。比如:
服务器端收到 POST 请求后就能看到完整的拦截详情,包括blocked-uri、document-uri、violated-directive 这些字段。
还有个土办法是在页面上放一个明显会被拦截的脚本,比如
,然后去 Network 面板确认这个请求的状态是 (blocked by CSP) 还是 404。如果是前者就说明 CSP 生效了。另外提醒一下,meta 标签设置 CSP 和响应头设置 CSP 在某些浏览器行为不太一样,有些浏览器会忽略 meta 标签的 report-uri。建议优先用响应头方式。