在 Web 安全领域,Content Security Policy(CSP)作为防御 XSS 攻击的核心手段,其有效性直接取决于策略配置的严谨程度。然而,配置不当的 CSP 往往形同虚设,甚至成为攻击者的突破口。2026 年 3 月,应用安全工程师 Carl Sampson 发布了一款名为 csp-toolkit 的 Python 库,填补了 Python 生态中 CSP 分析工具的空白。该工具支持解析 CSP 头、执行 21 项弱点检查、针对 79 个已知可利用域名查找绕过向量,并为策略打分 A+ 至 F。本文将深入探讨其技术实现与实战应用场景。

CSP 检测的工程化困境

CSP 是一种 HTTP 响应头,通过声明允许加载的资源来源,有效限制跨站脚本攻击的生效范围。尽管概念简单,但策略配置涉及 script-srcstyle-srcimg-srcconnect-srcframe-src 等十余个指令,每个指令又可包含具体域名、通配符、内联脚本标记、nonce 或 hash 值。实际部署中,开发者常常因为兼容性问题或调试便利而采用过度宽松的策略,如 script-src 'unsafe-inline' *,使得 CSP 形同虚设。

传统安全测试依赖手工审查或在线工具(如 Google CSP Evaluator),但这些方案存在明显局限。在 bug bounty 场景中,安全研究员需要对大量目标进行批量扫描;在 CI/CD 管道中,需要自动化检测策略变更是否引入安全回归。手动操作无法满足规模化需求,而现有 JavaScript 生态的 CSP 工具又难以集成到纯 Python 工作流中。csp-toolkit 的出现正是为了解决这一工程化难题。

核心功能与架构设计

csp-toolkit 本质上是一个 Python 库与 CLI 工具的结合体。其核心工作流程非常简洁:输入 CSP 字符串,输出结构化的分析结果。使用方式分为命令行与 Python 两种模式。

命令行模式下,分析单个策略的操作如下:

$ csp-toolkit analyze "script-src 'self' 'unsafe-inline' *.googleapis.com"

该命令会输出一个按严重程度排序的发现列表,同时给出字母评级与数值分数。同样的功能在 Python 代码中实现为:

import csp_toolkit

policy = csp_toolkit.parse("script-src 'self' 'unsafe-inline' *.googleapis.com")
findings = csp_toolkit.analyze(policy)
grade, score = csp_toolkit.score_policy(policy)
# 返回类似 "F (35/100), 8 findings" 的结果

工具共提供 15 个 CLI 命令,覆盖分析、实时获取、绕过搜索、扫描、差异对比、监控、CSP 生成、违规报告等场景。这种模块化设计使得不同阶段的安全测试可以灵活组合。

绕过向量检测机制

绕过检测是 csp-toolkit 最为实用的功能。其核心思路是将目标 CSP 中白名单域名与已知的可利用端点数据库进行交叉比对,输出具体的攻击向量。

该数据库包含三类绕过来源。第一类是 66 个 JSONP 端点,涵盖 Google 超过 10 个子域名、Facebook、Twitter、Yahoo、LinkedIn、Microsoft、GitHub、Spotify、Vimeo、Reddit、WordPress、Stripe、reCAPTCHA 等,每个端点都附带具体的回调参数。第二类是 13 个 CDN 域名,涉及 31 个脚本 gadgets,包括 AngularJS 模板注入、Vue.js 模板注入、Knockout.js data-bind、Lodash/Underscore 模板 RCE、Handlebars 原型污染、jQuery 选择器 XSS 等常见攻击手法。第三类是 18 个以上任意托管域名,如 raw.githubusercontent.com、codepen.io、vercel.app、netlify.app、pages.dev 等,攻击者可上传任意 JavaScript 代码。

执行绕过检测的命令示例:

$ csp-toolkit bypass "script-src 'self' *.googleapis.com cdnjs.cloudflare.com"

如果目标在 script-src 中白名单了 *.googleapis.com,工具会输出可用的 JSONP 端点列表,包括 maps.googleapis.com、translate.googleapis.com、accounts.google.com 上的具体攻击路径,并附带可直接测试的 <script src="..."> 载荷。结合 --check-live 参数还能验证这些端点是否仍然响应。

实战工作流与集成场景

csp-toolkit 的设计充分考虑了安全测试的完整生命周期。以下是典型的 bug bounty 工作流。

第一步是批量扫描目标列表。运行 csp-toolkit scan -f targets.txt -o csv > results.csv,工具会逐个获取目标的 CSP header,进行评分并输出 CSV 表格,按安全等级排序。测试人员可以直接定位评分最低的 F 级目标优先审计。

第二步是检测子域名策略差异。许多组织在不同子域名上部署了强度不同的 CSP,csp-toolkit subdomains example.com 会测试约 35 个常见子域名(www、api、staging、admin 等),揭示哪些端点存在更宽松的策略。

第三步是对弱目标进行深度分析。通过 csp-toolkit fetch https://weak-target.com --all 获取完整策略,再用 csp-toolkit bypass "their-csp-header-here" --check-live 验证可用的绕过向量。

第四步是策略差异对比。部署变更后,运行 csp-toolkit diff https://target.com https://staging.target.com 可精确显示新增或移除的指令与来源,并在策略弱化时发出警告。

第五步是长期监控。将扫描加入 cron 定时任务,持续收集目标 CSP;通过 csp-toolkit history https://target.com 查看历史变化,当出现新增 unsafe-inline、移除关键指令或引入宽松通配符时自动告警。

对于 CI/CD 集成,工具支持输出 JSON 格式结果,可与现有流水线无缝衔接。在代码提交阶段自动检测 CSP 策略变更是否引入了不安全配置,实现安全左移。

主流网站的 CSP 现状

作者对主流网站进行了实测分析,结果揭示了当前 CSP 部署的普遍问题。GitHub 获得 A+ 评级(98 分),其策略采用基于 nonce 的 script-src 配合 strict-dynamic,所有关键指令均已锁定,绕过向量为零,堪称行业标杆。Reddit 获得 A 评级(93 分),仅缺少 base-uri 指令,存在 1 个可利用绕过。Twitter/X 获得 B 评级(83 分),存在 5 个绕过向量,主要源于 twimg.com 上的 JSONP 端点与 CSP2 降级攻击。LinkedIn 获得 C 评级(78 分),图片与媒体指令使用通配符,存在 3 个 JSONP 绕过。

相比之下,Google 和 YouTube 虽拥有设计合理的策略(使用 nonce 与 strict-dynamic),但仅部署为 Content-Security-Policy-Report-Only 模式,违规仅记录日志而不实际拦截,等同于零保护,两者均获 D 评级(53 分)。Instagram、Facebook、Netflix 与 Apple 均获 F 评级,分别存在 7、12、2、4 个绕过向量,普遍存在 blob:unsafe-evaldata: 等高风险配置。

这些数据表明,即使技术实力雄厚的科技巨头,在 CSP 部署上仍存在大量疏漏。对于安全测试人员而言,这意味着可利用的攻击面仍然广阔;对于防御方而言,则需要更系统化的检测工具来发现并修复这些问题。

扩展功能与生态集成

csp-toolkit 还提供了多个针对性功能。nonce-check 命令通过多次请求目标 URL 检测 nonce 是否静态,静态 nonce 完全失效。header-inject 命令测试 CRLF 注入向量,攻击者可能通过注入额外响应头覆盖 CSP。report-uri 命令验证违规报告端点的可达性。

对于已收集的 CSP 违规 JSON 报告(来自 report-uri 端点、Reporting API 或浏览器导出),violations 命令可按被阻止的 URI 与生效指令进行分组,配合 --csp 参数提供修复建议。在 --fix-mode patch 模式下,工具会生成一份加法式的修补策略草案,并通过 --write-patch 保存以便部署前审核。

多 CSP 头场景下,浏览器实际执行的是多个策略的交集。effective 命令接受每行一个 CSP 值的文件,输出近似的交集策略,帮助理解目标实际的安全约束。

工具还内置了 CSP 生成器 generate,输出严格 / 中等 / 宽松三种预设,支持 header、meta 标签、nginx、Apache 四种格式。对于大规模扫描,项目提供了 10 个 ProjectDiscovery nuclei 模板以及 Chrome 扩展,可在浏览网页时直接显示当前页面的 CSP 评级。

技术价值与局限

csp-toolkit 的核心价值在于将原本需要手工完成的 CSP 分析过程自动化、规模化。其绕过数据库涵盖了当前最常见的攻击向量,评分机制提供了直观的优先级参考,与 Python 生态的深度集成则降低了安全自动化工具的开发门槛。

需要注意的是,工具的绕过检测基于已知端点数据库,数据库的覆盖范围决定了检测能力上限。随着新漏洞与新攻击手法的发现,数据库需要持续更新。此外,工具侧重于配置层面的分析,无法检测 CSP 在运行时可能存在的绕过(如通过服务工作者或 CSS 注入),这些场景仍需结合动态测试进行验证。


资料来源:csp-toolkit 项目由 Carl Sampson 开发,托管于 GitHub(sampsonc/csp_toolkit),最新版本 0.6.2 发布于 PyPI。