CSP 生成器
生成内容安全策略头
如何使用CSP 生成器
- 1输入你计划允许的策略指令(default-src、script-src、img-src 等)。
- 2输入你信任的来源域名或协议。
- 3查看生成的 Content-Security-Policy 响应头,粘到服务器配置中。
构建内容安全策略(CSP)
CSP = 指令1 值1 值2; 指令2 值3; ...CSP 将浏览器可加载脚本、样式、图片与连接的来源列入白名单,即使存在 XSS 漏洞也能阻止未授权内容注入。
建议先在 report-only(仅报告)模式下运行以记录违规,否则过严的策略会破坏站点上的合法资源。
CSP(内容安全策略)通过 HTTP 响应头告诉浏览器「只允许加载这些来源的资源」,是防御 XSS 的**纵深防御**手段。即使攻击者成功注入了脚本,如果不在白名单里,浏览器也会拒绝执行。最严格的策略是 `default-src 'none'`,然后逐项开放需要的来源。
**内联脚本是 CSP 落地的最大障碍**:默认 CSP 会禁止所有内联 <script> 和 onclick 属性。三个解决办法:① 提取到外部文件(最干净);② 用 nonce(每次响应生成随机值,<script nonce="...">);③ 用 hash(对脚本内容做 SHA-256)。`unsafe-inline` 虽然能放行内联脚本,但等于放弃了 CSP 的主要防护,应尽量避免。**建议先用 Content-Security-Policy-Report-Only 模式上线观察一段时间**,收集违规报告、调整策略后再切换为强制模式。
| 指令 | 作用 | 示例值 |
|---|---|---|
| default-src | 默认资源策略(兜底) | 'self' |
| script-src | JavaScript 来源 | 'self' 'nonce-xxx' |
| style-src | CSS 来源 | 'self' 'unsafe-inline' |
| img-src | 图片来源 | 'self' data: https: |
| connect-src | XHR/fetch/WebSocket | 'self' https://api.example.com |
| font-src | 字体来源 | 'self' https://fonts.gstatic.com |
| frame-ancestors | 允许被谁嵌套(防点击劫持) | 'none' |
| upgrade-insecure-requests | 自动升级 HTTP 请求 | (无值) |
| report-uri | 违规上报地址 | /csp-report |
常用 CSP 指令速查
常见问题
default-src 有什么作用?
它为所有未显式指定的指令提供兜底,因此设为 'self' 可覆盖大多数标签。
是否应先使用仅报告模式?
是,先观察上报的违规一段时间,以便在不破坏站点的前提下调整策略。
CSP 能阻止所有 XSS 吗?
它大幅降低影响,但属于纵深防御层,不能替代输入过滤。
CSP 能完全防住 XSS 吗?
不能,它是纵深防御的一环而非银弹。CSP 可以阻止外部脚本加载和大部分内联注入,但无法防御:① 已被允许的域名下的恶意脚本(如 CDN 被污染);② 通过 JSONP 端点注入;③ DOM 型 XSS 中直接操作已存在脚本的攻击。正确的防护层次是:输入验证 → 输出转义 → CSP → 定期安全审计。另外 csp 配置错误(如 script-src 包含 * 或允许 data:)反而形同虚设。
为什么加了 CSP 后第三方服务失效?
因为第三方(统计、广告、客服、地图、字体)通常要加载脚本、发起请求、嵌入 iframe,每一项都需要对应指令放行。排查方法:打开浏览器控制台,CSP 违规会打印具体被阻止的 URL 和违反的指令,按需添加即可。常见需求:Google Analytics 需要 script-src + connect-src,Google Fonts 需要 style-src + font-src,YouTube 嵌入需要 frame-src。**建议为第三方单独列出来源域名,而不是图省事用通配符。**
