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

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

68
0
0
0

Q:什么是内容安全策略(CSP),为什么需要它?

内容安全策略(Content Security Policy,简称CSP)是一种浏览器安全机制,通过定义允许加载资源的来源,有效防止跨站脚本攻击(XSS)、数据注入攻击、点击劫持等常见Web安全威胁。CSP通过HTTP响应头Content-Security-Policy或HTML meta标签来配置,告诉浏览器哪些资源来源是可信的。任何不符合策略的资源加载都会被浏览器阻止。在OWASP Top 10安全风险中,XSS长期位列前列,而CSP是目前公认的最有效的客户端防御手段。

Q:CSP能防止哪些类型的攻击?

CSP主要防御以下五类攻击:跨站脚本攻击(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窃取用户数据。

Q:如何测试CSP配置是否正确?

推荐以下测试方法:首先使用Report-Only模式——先部署Content-Security-Policy-Report-Only头,观察违规报告而不实际阻止资源加载;其次利用浏览器开发者工具——Chrome/Edge的Console面板会显示被CSP阻止的资源及具体指令;还可借助CSP评估工具——如Google的CSP Evaluator、Mozilla Observatory等在线检测工具;同时配置report-uri——将违规报告发送到指定端点,收集实际违规数据;最后采取逐步收紧策略——从宽松策略开始,逐步收紧,每次变更后充分测试。

Q:'self'、'none'、'unsafe-inline'等关键字的含义是什么?

'self'仅允许与页面同源的资源(相同协议、域名、端口);'none'不允许任何来源,相当于完全禁止该类型资源;'unsafe-inline'允许内联脚本和样式(如onclick属性、script标签内容),会显著降低安全性;'unsafe-eval'允许使用eval()、Function()等动态代码执行方法;'strict-dynamic'信任由已授权脚本动态创建的脚本,配合nonce使用可减少对'unsafe-inline'的依赖;'nonce-xxx'仅允许带有指定nonce属性的内联脚本/样式;'sha256-xxx'仅允许内容哈希匹配的内联脚本/样式。

Q:Nonce和Hash的区别是什么,如何选择?

Nonce(随机数)每次HTTP响应生成唯一字符串,需同时出现在CSP头和脚本标签的nonce属性中,适合动态内容但需要服务端支持且必须每次请求更新。Hash(哈希值)对脚本内容计算SHA-256哈希值放入CSP头,无需服务端动态生成适合静态内容,但脚本内容任何微小变化都需要更新哈希值。选择建议:静态站点适合hash方案,动态站点适合nonce方案,两者可结合使用。配合strict-dynamic可以进一步简化配置。

Q:CSP会影响网站性能吗?

CSP对性能的影响微乎其微。CSP检查在浏览器端进行,属于轻量级的来源比对操作,不会产生额外的网络请求。实际上合理的CSP配置可能略微提升性能,因为:阻止了不必要的第三方资源加载、减少了恶意脚本的执行、upgrade-insecure-requests减少了HTTP到HTTPS的重定向。唯一需要注意的是CSP头的长度不宜过长(建议控制在2KB以内),过长的头可能增加HTTP请求的头部开销。

Q:如何在不影响现有功能的情况下逐步实施CSP?

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

Q:常见的CSP配置错误有哪些?

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

Q:CSP Level 2和Level 3有什么区别?

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-src、worker-src、script-src-elem、style-src-elem等更细粒度的指令。目前主流浏览器已普遍支持Level 2,Level 3特性也在逐步落地。

Q:base-uri、form-action、frame-ancestors为什么不回退到default-src?

这三个指令被称为“不回退指令”(non-fallback directives),原因是它们控制的不是资源加载,而是页面的导航和安全行为:base-uri控制base标签的href属性,如果回退到default-src可能被攻击者利用来劫持相对URL;form-action控制表单提交目标,防止表单数据被发送到恶意站点,独立于资源加载;frame-ancestors控制页面被嵌入iframe的来源,是点击劫持防御的关键,与资源加载无关。因此即使设置了default-src也必须单独配置这三个指令才能获得完整保护。