Featured image of post 使用仅内容安全策略报告安全地测试 CSP 规则Featured image of post 使用仅内容安全策略报告安全地测试 CSP 规则

使用仅内容安全策略报告安全地测试 CSP 规则

在实施锁定之前,通过 CSP 报告路由脚本违规,避免实时站点回归。

损坏的小部件问题

部署内容安全策略是抵御 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-...' 的内联事件处理程序(onclickonload
  • 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(旧版)
占位符_0Report-To 标头中的端点组名称
占位符_0控制脚本执行
占位符_0控制样式表加载
占位符_0控制图像源
占位符_0控制 fetch/XMLHttpRequest/WebSocket
占位符_0控制 iframe 嵌入

仅报告的挑战

  • 仅报告每次页面加载的违规行为都会触发一次。 第一次报告后,同一页面上后续的相同违规行为将被大多数浏览器默默忽略。
  • **某些浏览器发送没有正文的报告。**及早过滤掉空报告。
  • 仅报告无法捕获表单提交目标违规 (form-action)。您需要强制模式来阻止这些。

概括

Content-Security-Policy-Report-Only 是无风险推出 CSP 的重要工具。它可以让您观察生产中的违规情况,根据实际流量迭代您的策略,并且仅在您确信不会出现任何问题时才执行。将其与报告收集服务配对,运行至少一周,然后逐渐过渡到强制模式。