先看浏览器控制台是否有“refused to execute inline script”等csp违规报错;若无报错且network响应头中无content-security-policy字段,则说明csp未配置或配置失效。

直接看浏览器控制台有没有CSP相关报错
没有配置CSP时,控制台不会报错;但一旦你加了策略又写错,比如拼错 Content-Security-Policy 字母、漏掉分号、用了不支持的指令(如 script-src 'unsafe-inline' 却没配 nonce),Chrome 或 Firefox 就会在控制台里输出明确的 CSP violation 信息。这类报错不是“漏洞”,而是“策略已生效但被违反”——说明你已经在用 CSP,只是配得不够准。
真正缺失 CSP 的表现是:控制台干干净净,Network → Response Headers 里也找不到 Content-Security-Policy 字段,且你确认过服务端没返回该头(比如 Nginx 配置漏加 add_header,或 Express 没用 helmet())。
用 curl 命令快速验证响应头是否包含 CSP
在终端执行:
curl -I https://yoursite.com
检查输出中是否存在 Content-Security-Policy: 行。注意三点:
- 必须是响应头(
-I参数才只取 header),不能只看 HTML 里的<meta http-equiv="Content-Security-Policy"> - 哪怕只写错一个字符(比如
Conten-Security-Policy),浏览器就完全忽略,等同于缺失 - 如果服务端同时返回了
Content-Security-Policy-Report-Only,那说明你在试运行模式,它不拦截,只上报——这不算“已修复”,只是“在调试”
为什么不能靠检查 标签来判断 CSP 是否生效
<meta http-equiv="Content-Security-Policy"> 在生产环境基本等于没写。原因很实际:
- 浏览器解析到
<script>alert(1)</script>就立刻执行,而<meta>得等 DOM 解析到那一行才注册策略——恶意脚本早就跑完了 - Safari 16.4 之前版本压根不支持
nonce-或sha256-写法,Chrome 124+ 已彻底移除对script-src 'unsafe-inline'在<meta>中的解析能力 - 只要服务端返回任意格式的
Content-Security-Policy响应头(哪怕内容为空或拼写错误),<meta>就被浏览器直接丢弃 -
file://协议下所有 CSP 全面失效,本地双击 HTML 测试毫无意义
扫描工具能发现 CSP 缺失,但别全信它的建议
像 securityheaders.com、curl -I、Burp Suite 的被动扫描,都能标出 “CSP header missing”。但它们无法判断你的业务是否真需要它:
- 纯静态页面、无用户输入、不加载第三方资源的 landing page,CSP 缺失风险极低
- 有表单、富文本、URL 参数拼接、动态
innerHTML的页面,缺 CSP 就等于给 XSS 留门 - 工具推荐的策略(比如
default-src 'self')往往太宽——它放行所有内联脚本,实际应优先用nonce或哈希 - 工具看不到你前端是否用了
eval()、setTimeout(string)、location.href = 'javascript:...'这类高危模式,而这恰恰是 CSP 要拦的重点
最可靠的判断方式,还是打开 DevTools → Application → Manifest(或直接搜 CSP),确认策略是否加载、是否匹配当前页面行为,尤其盯住那些动态插入 DOM 的 JS 逻辑——那里才是 CSP 缺失后最容易爆雷的地方。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











