CSP 审计实战:给现有内容安全策略检查漏洞并打分
教你做一次完整的内容安全策略检查:找出 unsafe-inline、通配符和缺失 default-src 这类弱点,排查 XSS 缺口,逐条加固,并给现有 CSP 打出一个可量化的安全分。
CSP 审计实战:给现有内容安全策略检查漏洞并打分
很多团队上线了 Content-Security-Policy,然后就再也没人回头看过。响应头里那串又长又乱的指令,看起来在防 XSS,实际上可能漏得像筛子。CSP 审计要做的,就是把这串字符串拆开,逐条核对每个 source,把削弱防护的地方挑出来。
为什么已经配了 CSP 还要审计
写一条 CSP 不难,写一条真正挡得住注入攻击的 CSP 才难。常见的情况是:开发期间为了让内联脚本跑起来,临时加了 unsafe-inline,上线后忘了删;或者为了对接第三方统计,直接写了 script-src *。这两种配置都会让整条策略形同虚设。攻击者只要找到一个能注入 HTML 的点,就能塞进自己的 <script> 标签,浏览器照样执行。
审计不是重写,而是体检。先把现有策略的真实防护水平摸清楚,再决定哪里要收紧。
三类必须避免的弱配置
我在审了几十条线上策略后,总结出杀伤力最大的三类问题:
第一类是 unsafe-inline 和 unsafe-eval。前者允许页面执行内联脚本和内联事件处理器,等于把 CSP 防 XSS 的核心能力关掉;后者放开 eval 和 new Function,给注入留了第二条路。script-src 里出现这两个关键字,基本可以判定防护已经被严重削弱,正确做法是改用 nonce 或 hash 白名单。
第二类是通配符 * 和裸 data:。script-src * 意味着任何域名的脚本都能加载,白名单退化成没有名单。data: 作为脚本源同样危险,攻击者可以用 data: URI 直接内联恶意代码。
第三类是缺失关键指令。没有 default-src 就意味着没有兜底,任何你没显式声明的资源类型都不受限制;缺 frame-ancestors 挡不住点击劫持;缺 base-uri 会让攻击者通过注入 <base> 标签劫持相对路径;缺 object-src 'none' 则给老式插件留了口子。
一个真实的审计例子
来看一条我审过的策略片段:
Content-Security-Policy: script-src 'self' 'unsafe-inline' https://cdn.example.com *.analytics.com; img-src *
逐条拆解后,问题立刻浮现:script-src 里带着 unsafe-inline,这一项就把脚本注入防护打穿了;*.analytics.com 这种宽泛子域通配,只要该统计服务任意一个子域被攻陷,就能往你的页面注入脚本;更要命的是整条策略没有 default-src,也没有 object-src、base-uri、frame-ancestors。换句话说,这条 CSP 看起来很专业,实际防护接近于零。
加固方向很明确:删掉 unsafe-inline,改用按请求生成的 nonce;把 *.analytics.com 收成具体的几个固定域名;补上 default-src 'self'、object-src 'none'、base-uri 'self'、frame-ancestors 'none',再加 upgrade-insecure-requests 和一个上报端点,方便分阶段观察哪些资源会被拦。
给 CSP 打分的思路
打分不是玄学,可以拆成几个权重维度:script-src 是否避开了 unsafe 关键字和通配符(占比最高),是否声明了 default-src 兜底,是否覆盖了 object-src、base-uri、frame-ancestors、form-action 这些防御性指令,以及是否配了上报。每缺一项或每出现一个高危关键字就扣分,最后得到一个 0 到 100 的分数。分数低于 60,基本说明这条策略需要重做而不是修补。
CSP 策略审计器 就是按这个逻辑工作的:粘贴你的响应头,它在浏览器本地解析指令、统计 nonce 和 hash 数量,标出每一处弱点,并把结果导出成 Markdown 或 JSON,直接丢进 issue 跟踪。整个过程不访问你的站点,响应头里那些内部资源域不会外泄。
第一人称体验
我自己第一次拿公司项目的 CSP 跑这个审计时,本以为顶多有一两个小问题,结果列出来七项,其中三项是高危。最扎心的是那个一直没删的 unsafe-inline,它在那条策略里躺了快一年,而我们团队一直以为 XSS 已经被 CSP 挡住了。从那以后我养成了习惯:每次发版前,把测试和生产两边的 CSP 都粘进去对比一遍,导出清单存进发布检查表。
安全审计是一条流水线
CSP 只是站点安全姿态的一环。审完策略,顺手还可以排查仓库和构建产物里有没有泄露的密钥,用 密钥泄露扫描器 扫一遍 env 文件和配置,能堵住另一类常见的事故。把这些本地审计串成发版前的固定动作,比上线后救火划算得多。
Made by Toolora · Updated 2026-06-13