什么是 Content-Security-Policy?
Content-Security-Policy (CSP) 是一个 HTTP 响应头,可帮助防止跨站脚本 (XSS)、点击劫持和其他代码注入攻击。它通过指定允许在网页上加载哪些内容源来工作。
易受攻击的状态
- 浏览器从任何来源加载资源
- 网站容易受到恶意脚本注入
- 无法控制内容源
- XSS 攻击风险更高
受保护的状态
- 严格控制允许的域名
- 自动阻止未授权的脚本
- 细粒度的资源权限
- 深度防御安全层
为什么使用 CSP 头部?
XSS 防护
阻止未授权的脚本在您的页面上执行,防止攻击者通过漏洞注入恶意代码。
数据盗窃防护
控制您的页面可以通过 fetch、XHR 或 WebSocket 连接向何处发送数据,防止数据外泄。
点击劫持防御
使用 frame-ancestors 指令防止您的网站被嵌入到恶意 iframe 中进行点击劫持攻击。
混合内容防护
使用 upgrade-insecure-requests 强制所有资源使用 HTTPS,消除混合内容漏洞。
此工具如何帮助您
手动编写 CSP 头部容易出错,需要记住指令名称和源语法。这个可视化构建器让您切换指令、点击源值,并立即看到生成的头部,格式可以是原始 HTTP、Apache、Nginx 或 PHP。
如何使用 CSP 头部生成器
选择起点
选择一个预设模板来开始使用常见配置,或选择空白从头开始构建。可用的预设包括严格、基础网站、SPA + API、WordPress、电商和 CDN 密集型配置。
配置指令
通过点击复选框或头部行来切换指令的开启或关闭。启用指令后,您可以:
- 点击快速源按钮('self'、'none'、'unsafe-inline' 等)来添加常见值
- 输入自定义域名(例如 cdn.example.com、*.googleapis.com)并点击添加
- 再次点击源按钮来移除它
- 点击自定义域名标签上的× 按钮来移除它们
查看警告
该工具会自动分析您的策略并显示安全警告。红色警告表示重大安全风险,黄色警告建议改进,蓝色通知提供有用信息。
选择输出格式
选择与您的网络服务器匹配的输出格式:
- 原始 - 纯 HTTP 头部值
- Apache - 用于 .htaccess 或 Apache 配置文件
- Nginx - 用于 nginx.conf 服务器块
- Meta 标签 - 用于 HTML <meta> 标签(注意:不支持 Report-Only)
- PHP - 用于 PHP header() 函数调用
复制并部署
点击复制按钮将生成的头部复制到您的剪贴板。考虑先启用Report-Only 模式来测试您的策略,而不阻止任何资源。
功能
可视化指令构建器
每个 CSP 指令都显示为带有切换开关的交互式行。启用指令以显示其源配置面板,其中包含快速添加按钮和自定义域名输入。指令分为四个类别:获取、文档、导航和其他。
16 个支持的指令
获取指令
控制可以从何处加载不同类型的资源:
default-src- 所有获取指令的后备script-src- JavaScript 源style-src- CSS 样式表img-src- 图像和网站图标connect-src- Fetch、XHR、WebSocket 连接font-src- 网络字体object-src- 插件(Flash、Java 小程序)media-src- 音频和视频frame-src- 嵌套浏览上下文(iframe)worker-src- Web Worker 和 Service Workermanifest-src- Web 应用清单
文档和导航指令
控制文档行为和导航:
base-uri- 限制可以出现在 <base> 元素中的 URLform-action- 表单提交的有效端点frame-ancestors- 可能嵌入此页面的有效父级(点击劫持防护)
frame-ancestors 无法通过 meta 标签设置 — 它需要 HTTP 头部。其他指令
其他安全增强功能:
upgrade-insecure-requests- 自动将 HTTP 升级到 HTTPSblock-all-mixed-content- 阻止所有混合内容(已弃用,使用 upgrade-insecure-requests)report-uri- 发送违规报告的端点(已弃用,使用 report-to)
预设模板
严格
基础网站
SPA + API
WordPress
电商
CDN 密集型
智能源管理
该工具自动处理源值逻辑以防止配置错误:
互斥性
选择 'none' 会自动清除所有其他源,因为它们是互斥的。
自动替换
当 'none' 处于活动状态时添加任何源会自动先移除 'none'。
重复防护
自动检测并防止添加重复的源。
安全分析
实时警告会提醒您 CSP 配置中的潜在安全问题:
多种输出格式
| 格式 | 用例 | Report-Only 支持 |
|---|---|---|
| 原始 HTTP | 任何服务器的纯头部值 | 是 |
| Apache | .htaccess 或 httpd.conf 文件 | 是 |
| Nginx | nginx.conf 服务器块 | 是 |
| Meta 标签 | HTML <meta> 元素 | 否 |
| PHP | PHP header() 函数 | 是 |
您的数据保持私密
所有处理都在您的浏览器中进行,零服务器通信:
无服务器请求
无跟踪
常见问题
Content-Security-Policy 和 Content-Security-Policy-Report-Only 有什么区别?
Content-Security-Policy 强制执行策略并阻止违反它的资源。Content-Security-Policy-Report-Only 仅报告违规而不阻止任何内容。
这种两阶段方法可以防止意外破坏功能,同时允许您监控违规报告并安全地完善您的策略。
为什么我应该始终包含 object-src 'none'?
object-src 指令控制 Flash 和 Java 小程序等插件。这些插件可以执行任意代码并绕过其他 CSP 防护。
将 object-src 设置为 'none' 会阻止所有插件内容,这是推荐的做法,因为:
- 现代网站很少需要插件
- Flash 和 Java 小程序已弃用且不安全
- 插件可以绕过 CSP script-src 限制
- 大多数浏览器正在逐步淘汰插件支持
'unsafe-inline' 真的那么危险吗?
是的。当您在 'unsafe-inline' 中允许 script-src 时,您页面上的任何内联脚本都可以执行 — 包括攻击者通过 XSS 漏洞注入的脚本。这会显著削弱 CSP 防护。
易受攻击
- 所有内联脚本执行
- 注入的脚本自由运行
- XSS 防护削弱
受保护
- 仅白名单脚本运行
- 注入的脚本被阻止
- 强大的 XSS 防护
更好的替代方案:使用 nonce 或哈希代替,它们允许特定的内联脚本,同时阻止注入的脚本。
default-src 有什么作用?
default-src 充当所有未明确设置的获取指令的后备。例如,如果您设置了 default-src 'self' 但未设置 img-src,图像将仅从您自己的域加载。
示例:
Content-Security-Policy:
default-src 'self';
script-src 'self' cdn.example.com;
img-src *;
/* Result:
* - Scripts: 'self' + cdn.example.com (explicit)
* - Images: * (explicit)
* - Styles: 'self' (falls back to default-src)
* - Fonts: 'self' (falls back to default-src)
*/
我可以对所有 CSP 功能使用 meta 标签格式吗?
不可以。HTML meta 标签方法有重大限制:
- 无法使用 Report-Only 模式
- 无法设置 frame-ancestors 指令
- 无法使用 report-uri 或 report-to
- 无法使用 sandbox 指令
Meta 标签对于快速测试或当您无法访问服务器配置时很有用,但 HTTP 头部提供完整的 CSP 功能。
'strict-dynamic' 是什么,我何时应该使用它?
'strict-dynamic' 告诉浏览器信任由已信任脚本加载的脚本。这对于动态加载 JavaScript 模块的现代应用程序很有用。
优势
简化动态应用的 CSP
- 适用于模块打包器
- 支持动态导入
- 减少策略复杂性
工作原理
信任传播模型
- 忽略基于主机的允许列表
- 适用于基于 nonce 的策略
- 脚本加载其他受信任的脚本
最适合:单页应用程序 (SPA)、React/Vue/Angular 应用程序以及使用 Webpack 或类似打包器的网站。
还没有评论,快来发表第一条!