Web安全之CSP内容安全策略详解
字数 1457 2025-11-18 08:26:01
Web安全之CSP内容安全策略详解
一、CSP概述与背景
内容安全策略(Content Security Policy,CSP)是一种基于HTTP头或标签的Web安全标准,用于检测和缓解特定类型的攻击,如跨站脚本(XSS)和数据注入。其核心思想是白名单机制:通过定义可信的内容来源,浏览器仅执行或加载来自这些来源的资源,从而阻止恶意代码的执行。
二、CSP的核心机制
-
策略指令(Directives):每个指令控制一类资源的加载权限,常见指令包括:
default-src:默认策略(fallback)script-src:控制JavaScript的执行来源style-src:控制CSS的来源img-src:控制图像的来源connect-src:控制Ajax、WebSocket等连接的目标font-src:控制字体文件来源object-src:控制插件(如Flash)来源frame-src:控制iframe嵌入来源base-uri:限制<base>标签的URLform-action:限制表单提交的目标
-
来源表达式(Source Expressions):
'none':禁止任何来源'self':仅允许同源资源'unsafe-inline':允许内联资源(如<script>标签内容)'unsafe-eval':允许动态代码执行(如eval())https::允许所有HTTPS来源example.com:允许特定域名'nonce-<value>':允许匹配特定nonce的内联脚本'sha256-<hash>':允许匹配哈希值的内联脚本
三、CSP的部署方式
- HTTP头部署(推荐):
Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.example.com - 标签部署:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
四、CSP防御XSS的实战示例
假设网站需防御XSS攻击,但需允许内联脚本和特定CDN的脚本:
-
初始策略(严格模式):
Content-Security-Policy: default-src 'self'; script-src 'self'此策略会阻止所有内联脚本和外部CDN脚本,导致网站功能异常。
-
逐步放宽策略:
- 方案1:允许特定CDN(风险较低):
script-src 'self' https://cdn.example.com - 方案2:允许内联脚本(需谨慎):
- 使用nonce(推荐):为每个内联脚本生成随机数:
策略头需包含:<script nonce="abc123">/* 合法脚本 */</script>script-src 'nonce-abc123' - 使用哈希(适合静态脚本):计算脚本内容的哈希值:
script-src 'sha256-abc123...'
- 使用nonce(推荐):为每个内联脚本生成随机数:
- 方案1:允许特定CDN(风险较低):
-
最终策略示例:
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com 'nonce-abc123'; style-src 'self' 'unsafe-inline'; img-src *; report-uri /csp-violation-endpoint- 允许同源脚本、特定CDN、带nonce的内联脚本
- 允许同源样式和内联样式(兼容UI库)
- 允许所有图片源(
*) - 配置违规报告端点(用于监控策略有效性)
五、CSP的进阶特性
-
报告模式(Report-Only):
通过Content-Security-Policy-Report-Only头仅报告违规而不阻塞资源,用于调试策略:Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report -
沙箱指令(sandbox):
限制页面行为(如禁止表单提交、新窗口等),常用于嵌入第三方内容:Content-Security-Policy: sandbox allow-scripts allow-forms -
升级不安全请求(upgrade-insecure-requests):
自动将HTTP资源升级为HTTPS:Content-Security-Policy: upgrade-insecure-requests
六、CSP的注意事项
- 谨慎使用
unsafe-inline和unsafe-eval:这些指令会显著削弱CSP的防护能力。 - 避免通配符(
*)滥用:如img-src *可能允许恶意图片上传。 - 兼容性处理:旧版浏览器可能忽略CSP,需配合其他XSS防护措施(如输入验证、输出编码)。
通过逐步定义资源白名单,CSP能有效降低XSS攻击面,但需根据实际业务需求平衡安全性与兼容性。