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-src、font-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。 - 步骤:
- 计算内联脚本的SHA256哈希:
生成哈希:<script>alert("合法代码");</script>sha256-abc123...(使用工具或浏览器控制台)。 - 在CSP头中添加:
script-src 'sha256-abc123...'。
- 计算内联脚本的SHA256哈希:
- 优势:仅允许哈希匹配的内联脚本,避免任意内联代码执行。
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-endpoint或report-to groupname,收集浏览器违规日志。 - 动态调整:
- 初始配置宽松策略(如仅禁止
eval)。 - 分析报告中的误拦和真实攻击,逐步收紧策略。
- 初始配置宽松策略(如仅禁止
- 监控价值:违规报告可暴露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适应动态脚本,并持续监控报告优化策略。避免过度依赖白名单,重点关注随机数管理和路径校验的严谨性。