CSP(内容安全策略)配置与防护(进阶篇)
字数 1659 2025-11-15 21:36:25

CSP(内容安全策略)配置与防护(进阶篇)

1. 知识点描述
CSP(内容安全策略)是一种以白名单机制约束浏览器资源加载的安全头,用于缓解XSS、数据注入等攻击。进阶篇聚焦复杂场景下的策略配置、常见绕过手法及动态策略管理。

2. CSP策略的组成与指令解析
CSP策略由多个指令构成,每个指令控制一类资源的加载权限:

  • default-src:默认回退指令,当其他资源指令未设置时生效。
  • script-src:控制JavaScript的加载源(如'self'https:、哈希或随机数)。
  • style-src:控制CSS的加载源。
  • connect-src:限制XMLHttpRequest、WebSocket等连接的目标。
  • 其他指令:如img-srcfont-src等,分别限制图片、字体等资源。

示例策略

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'unsafe-inline';

此策略允许:

  • 默认仅加载同源资源。
  • 脚本仅限同源或trusted.cdn.com
  • 内联CSS(通过unsafe-inline)被允许(存在风险)。

3. 进阶配置技巧与风险规避
3.1 非ce与哈希的应用

  • 场景:需允许特定内联脚本但避免unsafe-inline
  • 步骤
    1. 计算内联脚本的SHA256哈希:
      <script>alert("合法代码");</script>
      
      生成哈希:sha256-abc123...(使用工具或浏览器控制台)。
    2. 在CSP头中添加:script-src 'sha256-abc123...'
  • 优势:仅允许哈希匹配的内联脚本,避免任意内联代码执行。

3.2 严格动态(strict-dynamic)

  • 场景:现代框架(如React、Vue)动态生成脚本。
  • 配置
    script-src 'strict-dynamic' 'nonce-RANDOM123' 'self'
    
    • nonce:每次页面加载生成随机数,标记合法脚本(如<script nonce="RANDOM123">)。
    • strict-dynamic:允许由合法脚本动态加载的依赖(如通过document.createElement加载的脚本)。
  • 注意:此配置会忽略self等白名单,需确保非ce难以被攻击者预测。

4. 常见CSP绕过手法与防护
4.1 JSONP端点滥用

  • 原理:若策略包含script-src 'self' https://api.example.com,攻击者可能利用该域下的JSONP接口执行恶意代码(因JSONP返回脚本)。
  • 防护:审核白名单域名是否包含不可控的JSONP接口,或使用strict-dynamic减少依赖。

4.2 路径遍历绕过

  • 案例:策略为script-src 'self'/trusted/,但攻击者通过https://site.com/trusted/..%2fevil.js绕过路径限制。
  • 防护:服务器需规范化路径后再校验,或使用子域名隔离资源。

4.3 AngularJS沙箱逃逸(历史漏洞)

  • 背景:早期AngularJS可通过构造特定Payload在CSP限制下执行代码。
  • 现状:现代Angular已修复,但需警惕类似框架的表达式注入。

5. 动态CSP与违规报告机制

  • 报告指令:添加report-uri /csp-report-endpointreport-to groupname,收集浏览器违规日志。
  • 动态调整
    1. 初始配置宽松策略(如仅禁止eval)。
    2. 分析报告中的误拦和真实攻击,逐步收紧策略。
  • 监控价值:违规报告可暴露XSS攻击尝试,辅助威胁狩猎。

6. 实战配置示例
安全策略模板

Content-Security-Policy:  
  default-src 'none';  
  script-src 'strict-dynamic' 'nonce-{RANDOM}' 'unsafe-eval' https:;  
  style-src 'self' 'unsafe-inline';  
  connect-src 'self';  
  report-uri /csp-reports;  
  • 逐步用哈希替代unsafe-inline,移除unsafe-eval
  • 生产环境使用Report-To替代report-uri(支持网络错误报告)。

7. 总结
CSP进阶配置需平衡安全性与兼容性,通过非ce/哈希替代unsafe-inline,利用strict-dynamic适应动态脚本,并持续监控报告优化策略。避免过度依赖白名单,重点关注随机数管理和路径校验的严谨性。

CSP(内容安全策略)配置与防护(进阶篇) 1. 知识点描述 CSP(内容安全策略)是一种以白名单机制约束浏览器资源加载的安全头,用于缓解XSS、数据注入等攻击。进阶篇聚焦复杂场景下的策略配置、常见绕过手法及动态策略管理。 2. CSP策略的组成与指令解析 CSP策略由多个指令构成,每个指令控制一类资源的加载权限: default-src :默认回退指令,当其他资源指令未设置时生效。 script-src :控制JavaScript的加载源(如 'self' 、 https: 、哈希或随机数)。 style-src :控制CSS的加载源。 connect-src :限制XMLHttpRequest、WebSocket等连接的目标。 其他指令 :如 img-src 、 font-src 等,分别限制图片、字体等资源。 示例策略 : 此策略允许: 默认仅加载同源资源。 脚本仅限同源或 trusted.cdn.com 。 内联CSS(通过 unsafe-inline )被允许(存在风险)。 3. 进阶配置技巧与风险规避 3.1 非ce与哈希的应用 场景 :需允许特定内联脚本但避免 unsafe-inline 。 步骤 : 计算内联脚本的SHA256哈希: 生成哈希: sha256-abc123... (使用工具或浏览器控制台)。 在CSP头中添加: script-src 'sha256-abc123...' 。 优势 :仅允许哈希匹配的内联脚本,避免任意内联代码执行。 3.2 严格动态(strict-dynamic) 场景 :现代框架(如React、Vue)动态生成脚本。 配置 : nonce :每次页面加载生成随机数,标记合法脚本(如 <script nonce="RANDOM123"> )。 strict-dynamic :允许由合法脚本动态加载的依赖(如通过 document.createElement 加载的脚本)。 注意 :此配置会忽略 self 等白名单,需确保非ce难以被攻击者预测。 4. 常见CSP绕过手法与防护 4.1 JSONP端点滥用 原理 :若策略包含 script-src 'self' https://api.example.com ,攻击者可能利用该域下的JSONP接口执行恶意代码(因JSONP返回脚本)。 防护 :审核白名单域名是否包含不可控的JSONP接口,或使用 strict-dynamic 减少依赖。 4.2 路径遍历绕过 案例 :策略为 script-src 'self'/trusted/ ,但攻击者通过 https://site.com/trusted/..%2fevil.js 绕过路径限制。 防护 :服务器需规范化路径后再校验,或使用子域名隔离资源。 4.3 AngularJS沙箱逃逸(历史漏洞) 背景 :早期AngularJS可通过构造特定Payload在CSP限制下执行代码。 现状 :现代Angular已修复,但需警惕类似框架的表达式注入。 5. 动态CSP与违规报告机制 报告指令 :添加 report-uri /csp-report-endpoint 或 report-to groupname ,收集浏览器违规日志。 动态调整 : 初始配置宽松策略(如仅禁止 eval )。 分析报告中的误拦和真实攻击,逐步收紧策略。 监控价值 :违规报告可暴露XSS攻击尝试,辅助威胁狩猎。 6. 实战配置示例 安全策略模板 : 逐步用哈希替代 unsafe-inline ,移除 unsafe-eval 。 生产环境使用 Report-To 替代 report-uri (支持网络错误报告)。 7. 总结 CSP进阶配置需平衡安全性与兼容性,通过非ce/哈希替代 unsafe-inline ,利用 strict-dynamic 适应动态脚本,并持续监控报告优化策略。避免过度依赖白名单,重点关注随机数管理和路径校验的严谨性。