常用 CSP 内容安全策略
汇集实际工作中常用配置的 Content-Security-Policy 头部值:从严格的起步策略,到 Google Fonts、统计分析、YouTube 嵌入、基于 nonce 的脚本、防点击劫持。点击卡片复制策略,设置为 Content-Security-Policy 头部的值即可。卡片顶部的色带每格代表一条指令,琥珀色格子表示该指令包含值得复查的 unsafe-* 来源。
严格起步策略(仅同源)
default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'同源 + 任意 https 图片
default-src 'self'; img-src 'self' data: https:; object-src 'none'; base-uri 'self'调用单一 API 源的 SPA
default-src 'self'; connect-src 'self' https://api.example.com; img-src 'self' data:; object-src 'none'允许 Google Fonts
default-src 'self'; style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; object-src 'none'Google Analytics 4
default-src 'self'; script-src 'self' https://www.googletagmanager.com; connect-src 'self' https://*.google-analytics.com https://*.analytics.google.com; img-src 'self' https://*.google-analytics.com; object-src 'none'允许 YouTube 嵌入
default-src 'self'; frame-src https://www.youtube-nocookie.com https://www.youtube.com; img-src 'self' https://i.ytimg.com; object-src 'none'nonce + strict-dynamic 脚本
script-src 'nonce-{RANDOM}' 'strict-dynamic'; object-src 'none'; base-uri 'none'务实版:允许内联样式
default-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'将 http 子资源升级为 https
default-src 'self'; upgrade-insecure-requests防点击劫持(禁止被嵌入)
frame-ancestors 'none'Report-Only 试运行起步
default-src 'self'; report-uri /csp-report; report-to csp-endpoint常见问题
- CSP 设置在哪里?
- 最好设置为 HTTP 响应头:在服务器、CDN 或托管配置中写 Content-Security-Policy: <值>。<meta http-equiv="Content-Security-Policy"> 标签对大多数指令也有效,但 frame-ancestors、report-uri 和 report-to 只支持头部,包含它们的配方必须以响应头设置。
- 怎样在不弄坏网站的情况下上线?
- 先用 Content-Security-Policy-Report-Only 头(即这里的 Report-Only 配方):浏览器只报告违规,不拦截任何内容。观察一周报告,把网站真正需要的来源补进去,再把同样的值切换为强制头。
- nonce-{RANDOM} 占位符怎么用?
- 把 {RANDOM} 换成每次响应新生成的 base64 值,并把同一个值以 nonce="…" 写进每个 script 标签。配合 strict-dynamic,就只允许你输出的脚本(及其加载的内容),注入的一律拦截,比维护主机白名单更强。
- 为什么 'unsafe-inline' 标成琥珀色?
- 允许内联代码是 XSS 攻击最常利用的口子:注入的 <script> 或 style 属性会像你自己的代码一样执行。style-src 'unsafe-inline' 配方之所以存在,是因为不少框架仍会注入内联样式,但请把它当作权宜之计;脚本应改用 nonce 或哈希,所以这里没有任何配方包含 script-src 'unsafe-inline'。