← 中文资源

简体中文版本

经 Report-Only 渐进上线 CSP

先以 report-only 模式部署严格 CSP,采集真实用户违规报告并修复根因,报告静默后再切换强制执行。

阅读英文原文

目标

第一天就强制执行严格 CSP,等于赌每个页面、插件与第三方脚本都已合规。Report-Only 移除了赌注:同一份策略先以监听模式上线,真实用户生成违规清单,每条要么修代码要么显式例外。只有当报告流证明策略与现实吻合时才切换强制,且报告持续保留作为永久回归探测器。

步骤要点

  1. 以 Content-Security-Policy-Report-Only 发布目标策略并指向 /csp-report,先不拦截任何东西。
  2. 聚合 24 小时报告:按 blockedUri 排名,得到页面仍依赖的第三方源与内联模式清单。
  3. 逐条处置:内联脚本迁文件、确实需要的源做最小化 allow-list。
  4. 以“每小时唯一违规数趋零”为门禁,而非日历日期。
  5. 把同一份策略原样切到 Content-Security-Policy 强制头,report-uri 继续保留捕获未来回归。

排错提示

报告洪峰淹没收集端就在采集侧采样、按 document-uri+blockedUri 去重并设总量上限,信号在唯一组合不在体量;违规只出现在旧缓存页是文档缓存头太长,迁移期收紧文档缓存并预期长尾;第三方要 unsafe-inline 时别为一个小部件静默放宽全站,用 nonce 显式承担或换掉厂商。

适用边界

Report-Only 抓不到只在强制后才触发的路径(如特性开关后的代码),切换后要继续开着报告;低流量页面报告样本不足,需要定向手工测试补验证。

代码示例

# Phase 1: listen
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self'; report-uri /csp-report;

# Phase 2: enforce the identical policy
Content-Security-Policy: default-src 'self'; script-src 'self'; report-uri /csp-report;