无需登录 数据私有 本地保存

内容安全策略生成器 - CSP HTTP头在线定制

12
0
0
0
预设模板 |
|
生成的 Nonce:
指令配置
配置各项指令的值,未配置的指令不会出现在CSP中
布尔指令(无需值)
实时预览
HTTP 响应头:
Content-Security-Policy: default-src 'self';
HTML Meta 标签:
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
已配置 0 个指令
常见问题与知识点

内容安全策略(Content Security Policy,简称CSP)是一种浏览器安全机制,通过定义允许加载资源的来源,有效防止跨站脚本攻击(XSS)、数据注入攻击、点击劫持等常见Web安全威胁。

CSP通过HTTP响应头Content-Security-Policy或HTML <meta>标签来配置,告诉浏览器哪些资源来源是可信的。任何不符合策略的资源加载都会被浏览器阻止。

  • 跨站脚本攻击(XSS):通过限制脚本来源,阻止恶意内联脚本和外部脚本的执行。
  • 数据注入攻击:限制style-src、img-src等,防止通过样式或图片注入恶意代码。
  • 点击劫持(Clickjacking):通过frame-ancestors指令控制页面能否被嵌入iframe。
  • 混合内容攻击:通过upgrade-insecure-requests和block-all-mixed-content防止HTTP资源混入HTTPS页面。
  • CSS注入/数据窃取:限制style-src和connect-src,防止通过CSS或Ajax窃取数据。

推荐以下几种测试方法:

  1. 使用Report-Only模式:先部署Content-Security-Policy-Report-Only头,观察报告而不实际阻止资源。
  2. 浏览器开发者工具:Chrome/Edge的Console会显示被CSP阻止的资源及具体指令。
  3. CSP评估工具:如Google的CSP Evaluator、Mozilla Observatory等在线检测工具。
  4. 配置report-uri:将违规报告发送到指定端点,收集实际违规数据。
  5. 逐步收紧策略:从宽松策略开始,逐步收紧,每次变更后充分测试。

关键字含义
'self'仅允许与页面同源的资源(相同协议、域名、端口)
'none'不允许任何来源,相当于完全禁止该类型资源
'unsafe-inline'允许内联脚本/样式(如onclick属性、<script>标签内容)— 会降低安全性
'unsafe-eval'允许使用eval()、Function()等动态代码执行方法 — 会降低安全性
'strict-dynamic'信任由已授权脚本动态创建的脚本,配合nonce使用可减少对'unsafe-inline'的依赖
'nonce-xxx'仅允许带有指定nonce属性的内联脚本/样式,nonce值每次请求应随机生成
'sha256-xxx'仅允许内容哈希匹配的内联脚本/样式,基于内容计算

Nonce(随机数):每次HTTP响应生成一个唯一的随机字符串,需要同时出现在CSP头和脚本标签的nonce属性中。优点是灵活,适合动态内容;缺点是需要服务端支持,且必须每次请求都更新。

Hash(哈希值):对脚本内容计算SHA-256等哈希值,将哈希值放入CSP头。优点是无需服务端动态生成,适合静态内容;缺点是脚本内容任何微小变化都需要更新哈希值。

选择建议:静态站点适合hash,动态站点适合nonce。两者可以结合使用。'strict-dynamic'配合nonce可以减少对'unsafe-inline'的依赖。

CSP对性能的影响微乎其微。CSP检查在浏览器端进行,属于轻量级的来源比对操作,不会产生额外的网络请求。实际上,合理的CSP配置可能略微提升性能,因为:

  • 阻止了不必要的第三方资源加载
  • 减少了恶意脚本的执行
  • upgrade-insecure-requests减少了HTTP到HTTPS的重定向

唯一需要注意的是,CSP头的长度不宜过长(建议控制在2KB以内),过长的头可能增加HTTP请求的头部开销。

  1. 第一步:使用Report-Only模式 — 部署Content-Security-Policy-Report-Only头,收集违规报告。
  2. 第二步:配置report-uri — 将违规报告发送到分析端点,了解哪些资源会被阻止。
  3. 第三步:从宽松策略开始 — 使用本工具的"宽松模式"预设,逐步收紧。
  4. 第四步:处理违规 — 修改代码消除内联脚本、将第三方资源加入白名单。
  5. 第五步:切换到强制执行 — 确认无违规后,改为Content-Security-Policy正式部署。
  6. 第六步:持续监控 — 保留report-uri持续收集报告。

  • 过度使用'unsafe-inline':使script-src形同虚设,无法防御XSS。
  • default-src设置为'none'但未配置其他指令:导致所有资源被阻止,页面完全无法加载。
  • 遗漏base-uri和form-action:这两个指令不回退到default-src,未设置时不受限制。
  • 使用通配符*:允许所有来源,失去了CSP的保护意义。
  • CSP头过长:某些代理或服务器可能截断过长的HTTP头。
  • 忘记frame-ancestors:无法防止点击劫持,应配合或替代X-Frame-Options使用。

CSP Level 2(2016年正式发布)引入了:base-uri、child-src、form-action、frame-ancestors、plugin-types、report-uri、'nonce-'、'sha256-'/'sha384-'/'sha512-'等。

CSP Level 3(持续推进中)新增了:

  • 'strict-dynamic' — 配合nonce,信任由已授权脚本动态创建的脚本
  • 'unsafe-hashes' — 允许事件处理器中的哈希匹配
  • report-to — 替代report-uri,使用Reporting API
  • manifest-srcworker-srcscript-src-elemstyle-src-elem等更细粒度的指令

目前主流浏览器已普遍支持CSP Level 2,Level 3的特性也在逐步落地。建议优先使用广泛支持的指令,新特性可作为增强。

这三个指令被称为"不回退指令"(non-fallback directives),原因是它们控制的不是资源加载,而是页面的导航和安全行为:

  • base-uri:控制<base>标签的href属性,如果回退到default-src可能被攻击者利用来劫持相对URL。
  • form-action:控制表单提交目标,防止表单数据被发送到恶意站点。独立于资源加载。
  • frame-ancestors:控制页面被嵌入iframe的来源,是点击劫持防御的关键。与资源加载无关。

因此,即使设置了default-src,也必须单独配置这三个指令才能获得完整保护。