损坏的小部件问题
部署内容安全策略是抵御 XSS 攻击的最强有力的防御措施之一。但是,一个错误配置的指令可能会默默地破坏内联脚本、阻止 CDN 资源或禁用分析。如果您直接通过 Content-Security-Policy 标头应用 CSP,并且关键脚本被阻止,您的生产站点就会中断 - 通常没有明显的错误控制台通知。
这就是仅报告模式拯救世界的地方。
仅报告与强制模式
CSP 支持两个标头:
| 标题 | 行为 |
|---|---|
| 占位符_0 | 立即阻止违规行为 |
| 占位符_0 | 记录违规行为而不阻止 |
使用“仅报告”时,不允许的脚本仍会执行,但浏览器会将 JSON 违规报告发布到指定端点。您可以在锁定策略之前审核每个误报。
设置仅报告
Content-Security-Policy-Report-Only: default-src 'self';
script-src 'self' https://analytics.example.com;
report-uri https://your-site.example/csp-reports;
report-to csp-endpoint;
report-uri 指令(已弃用但得到广泛支持)将报告发送到 URL。较新的 report-to 指令使用 Report-To 标头来定义端点组。为了获得最大的浏览器覆盖范围,请同时包含两者。
接收报告
每个违规报告都是一个 JSON 负载:
{
"csp-report": {
"document-uri": "https://example.com/page",
"blocked-uri": "https://evil.com/script.js",
"violated-directive": "script-src 'self'",
"effective-directive": "script-src",
"original-policy": "default-src 'self'; script-src 'self'"
}
}
您可以通过以下方式收集这些信息:
- 记录到文件或数据库的专用服务器路由
- 第三方服务,如 报告 URI (report-uri.com)
- 云提供商日志分析(AWS S3 + Lambda、Cloudflare Workers)
渐进式 CSP 部署策略
安全推出分为四个阶段:
第 1 阶段 — 监控(仅报告)
使用后端切换或反向代理规则将 Content-Security-Policy-Report-Only 应用于流量子集。让它运行 1-2 周以捕获所有合法资源模式。
# nginx: report-only for staging
add_header Content-Security-Policy-Report-Only "default-src 'self'; report-uri /csp-reports;" always;
第 2 阶段 — 分类报告
分析收集到的报告。常见的误报包括:
- 需要
'unsafe-hashes'或'nonce-...'的内联事件处理程序(onclick、onload) script-src中未列出的第三方 CDN 脚本connect-src未涵盖 WebSocket 连接
第 3 阶段 — 锁定(强制)
一旦报告流稳定(连续几天零意外违规),请切换到强制标头。保持“仅限报告”活动,并采取更严格的政策,探索进一步紧缩政策。
第 4 阶段——迭代
Content-Security-Policy: default-src 'self';
script-src 'self' 'nonce-abc123';
report-uri https://your-site.example/csp-reports;
Content-Security-Policy-Report-Only: default-src 'self';
script-src 'none';
report-uri https://your-site.example/csp-reports;
与强制执行的策略一起运行第二个仅报告策略,以无风险地测试更严格的未来版本。
仅报告的关键指令
| 指令 | 目的 |
|---|---|
| 占位符_0 | 接收违规报告的 URL(旧版) |
| 占位符_0 | Report-To 标头中的端点组名称 |
| 占位符_0 | 控制脚本执行 |
| 占位符_0 | 控制样式表加载 |
| 占位符_0 | 控制图像源 |
| 占位符_0 | 控制 fetch/XMLHttpRequest/WebSocket |
| 占位符_0 | 控制 iframe 嵌入 |
仅报告的挑战
- 仅报告每次页面加载的违规行为都会触发一次。 第一次报告后,同一页面上后续的相同违规行为将被大多数浏览器默默忽略。
- **某些浏览器发送没有正文的报告。**及早过滤掉空报告。
- 仅报告无法捕获表单提交目标违规 (
form-action)。您需要强制模式来阻止这些。
概括
Content-Security-Policy-Report-Only 是无风险推出 CSP 的重要工具。它可以让您观察生产中的违规情况,根据实际流量迭代您的策略,并且仅在您确信不会出现任何问题时才执行。将其与报告收集服务配对,运行至少一周,然后逐渐过渡到强制模式。

