Web安全之CSP内容安全策略详解
字数 1457 2025-11-18 08:26:01

Web安全之CSP内容安全策略详解

一、CSP概述与背景
内容安全策略(Content Security Policy,CSP)是一种基于HTTP头或标签的Web安全标准,用于检测和缓解特定类型的攻击,如跨站脚本(XSS)和数据注入。其核心思想是白名单机制:通过定义可信的内容来源,浏览器仅执行或加载来自这些来源的资源,从而阻止恶意代码的执行。

二、CSP的核心机制

  1. 策略指令(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>标签的URL
    • form-action:限制表单提交的目标
  2. 来源表达式(Source Expressions)

    • 'none':禁止任何来源
    • 'self':仅允许同源资源
    • 'unsafe-inline':允许内联资源(如<script>标签内容)
    • 'unsafe-eval':允许动态代码执行(如eval()
    • https::允许所有HTTPS来源
    • example.com:允许特定域名
    • 'nonce-<value>':允许匹配特定nonce的内联脚本
    • 'sha256-<hash>':允许匹配哈希值的内联脚本

三、CSP的部署方式

  1. HTTP头部署(推荐)
    Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.example.com
    
  2. 标签部署
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'">
    

四、CSP防御XSS的实战示例
假设网站需防御XSS攻击,但需允许内联脚本和特定CDN的脚本:

  1. 初始策略(严格模式)

    Content-Security-Policy: default-src 'self'; script-src 'self'
    

    此策略会阻止所有内联脚本和外部CDN脚本,导致网站功能异常。

  2. 逐步放宽策略

    • 方案1:允许特定CDN(风险较低):
      script-src 'self' https://cdn.example.com
      
    • 方案2:允许内联脚本(需谨慎):
      • 使用nonce(推荐):为每个内联脚本生成随机数:
        <script nonce="abc123">/* 合法脚本 */</script>
        
        策略头需包含:script-src 'nonce-abc123'
      • 使用哈希(适合静态脚本):计算脚本内容的哈希值:
        script-src 'sha256-abc123...'
        
  3. 最终策略示例

    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的进阶特性

  1. 报告模式(Report-Only)
    通过Content-Security-Policy-Report-Only头仅报告违规而不阻塞资源,用于调试策略:

    Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
    
  2. 沙箱指令(sandbox)
    限制页面行为(如禁止表单提交、新窗口等),常用于嵌入第三方内容:

    Content-Security-Policy: sandbox allow-scripts allow-forms
    
  3. 升级不安全请求(upgrade-insecure-requests)
    自动将HTTP资源升级为HTTPS:

    Content-Security-Policy: upgrade-insecure-requests
    

六、CSP的注意事项

  1. 谨慎使用unsafe-inlineunsafe-eval:这些指令会显著削弱CSP的防护能力。
  2. 避免通配符(*)滥用:如img-src *可能允许恶意图片上传。
  3. 兼容性处理:旧版浏览器可能忽略CSP,需配合其他XSS防护措施(如输入验证、输出编码)。

通过逐步定义资源白名单,CSP能有效降低XSS攻击面,但需根据实际业务需求平衡安全性与兼容性。

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> 标签的URL form-action :限制表单提交的目标 来源表达式(Source Expressions) : 'none' :禁止任何来源 'self' :仅允许同源资源 'unsafe-inline' :允许内联资源(如 <script> 标签内容) 'unsafe-eval' :允许动态代码执行(如 eval() ) https: :允许所有HTTPS来源 example.com :允许特定域名 'nonce-<value>' :允许匹配特定nonce的内联脚本 'sha256-<hash>' :允许匹配哈希值的内联脚本 三、CSP的部署方式 HTTP头部署(推荐) : 标签部署 : 四、CSP防御XSS的实战示例 假设网站需防御XSS攻击,但需允许内联脚本和特定CDN的脚本: 初始策略(严格模式) : 此策略会阻止所有内联脚本和外部CDN脚本,导致网站功能异常。 逐步放宽策略 : 方案1:允许特定CDN (风险较低): 方案2:允许内联脚本 (需谨慎): 使用nonce (推荐):为每个内联脚本生成随机数: 策略头需包含: script-src 'nonce-abc123' 使用哈希 (适合静态脚本):计算脚本内容的哈希值: 最终策略示例 : 允许同源脚本、特定CDN、带nonce的内联脚本 允许同源样式和内联样式(兼容UI库) 允许所有图片源( * ) 配置违规报告端点(用于监控策略有效性) 五、CSP的进阶特性 报告模式(Report-Only) : 通过 Content-Security-Policy-Report-Only 头仅报告违规而不阻塞资源,用于调试策略: 沙箱指令(sandbox) : 限制页面行为(如禁止表单提交、新窗口等),常用于嵌入第三方内容: 升级不安全请求(upgrade-insecure-requests) : 自动将HTTP资源升级为HTTPS: 六、CSP的注意事项 谨慎使用 unsafe-inline 和 unsafe-eval :这些指令会显著削弱CSP的防护能力。 避免通配符( * )滥用 :如 img-src * 可能允许恶意图片上传。 兼容性处理 :旧版浏览器可能忽略CSP,需配合其他XSS防护措施(如输入验证、输出编码)。 通过逐步定义资源白名单,CSP能有效降低XSS攻击面,但需根据实际业务需求平衡安全性与兼容性。