内容安全策略(CSP)
字数 1166 2025-11-29 13:50:23

内容安全策略(CSP)

  1. 基础概念
    内容安全策略是一种以HTTP响应头或<meta>标签形式实现的浏览器安全机制,用于检测和缓解特定类型的前端攻击。其核心原理是允许网站开发者通过声明策略指令,精确控制页面可加载资源的来源(如脚本、样式表、图片等),从而减少跨站脚本攻击(XSS)和数据注入攻击的风险。

  2. 策略指令结构
    CSP策略由多个指令构成,每个指令对应一类资源类型:

    • default-src:为未明确指定的指令提供默认来源限制
    • script-src:控制JavaScript执行来源
    • style-src:控制CSS样式表来源
    • img-src:控制图像资源来源
    • connect-src:限制XMLHttpRequest、WebSocket等连接目标
    • 其他指令如font-srcmedia-src等覆盖特定资源类型
  3. 来源表达式语法
    指令值使用来源表达式定义允许列表:

    • 'none':完全禁止加载该类资源
    • 'self':仅允许同源资源
    • https::允许所有HTTPS域名
    • example.com:允许特定域名(可含通配符*.example.com
    • 'unsafe-inline':允许内联脚本/样式(会降低安全性)
    • 'nonce-{随机值}':通过一次性随机数允许特定内联元素
    • 'sha256-{哈希值}':通过哈希值匹配允许的内联内容
  4. 部署模式
    CSP支持渐进式部署模式:

    • 仅报告模式:通过Content-Security-Policy-Report-Only头发送策略,违规行为仅上报至report-uri指定端点而不阻塞执行
    • 强制执行模式:使用Content-Security-Policy头,浏览器会直接拦截违规资源加载
    • 混合模式:可同时设置两种头部,用于测试新策略影响
  5. 高级防护机制

    • 严格动态:通过'strict-dynamic'配合nonce机制,允许由已信任脚本动态加载的依赖资源
    • 框架祖先限制:使用frame-ancestors指令防止点击劫持,替代陈旧的X-Frame-Options头
    • 升级请求:通过upgrade-insecure-requests指令自动将HTTP资源请求升级为HTTPS
  6. 实际应用场景

    • 对抗存储型XSS:禁止内联脚本执行,仅允许经过校验的外部脚本
    • 防止数据泄露:通过form-action限制表单提交目标,阻止敏感数据发送至恶意端点
    • 资源完整性保障:结合子资源完整性(SRI)哈希验证,确保外部资源未被篡改
  7. 策略优化实践

    • 使用工具(如CSP分析器)自动提取页面资源依赖生成初始策略
    • 通过浏览器开发者工具的CSP违规报告持续优化来源列表
    • 采用非ce+严格动态的现代配置模式,避免维护静态域名白名单的复杂性
内容安全策略(CSP) 基础概念 内容安全策略是一种以HTTP响应头或 <meta> 标签形式实现的浏览器安全机制,用于检测和缓解特定类型的前端攻击。其核心原理是允许网站开发者通过声明策略指令,精确控制页面可加载资源的来源(如脚本、样式表、图片等),从而减少跨站脚本攻击(XSS)和数据注入攻击的风险。 策略指令结构 CSP策略由多个指令构成,每个指令对应一类资源类型: default-src :为未明确指定的指令提供默认来源限制 script-src :控制JavaScript执行来源 style-src :控制CSS样式表来源 img-src :控制图像资源来源 connect-src :限制XMLHttpRequest、WebSocket等连接目标 其他指令如 font-src 、 media-src 等覆盖特定资源类型 来源表达式语法 指令值使用来源表达式定义允许列表: 'none' :完全禁止加载该类资源 'self' :仅允许同源资源 https: :允许所有HTTPS域名 example.com :允许特定域名(可含通配符 *.example.com ) 'unsafe-inline' :允许内联脚本/样式(会降低安全性) 'nonce-{随机值}' :通过一次性随机数允许特定内联元素 'sha256-{哈希值}' :通过哈希值匹配允许的内联内容 部署模式 CSP支持渐进式部署模式: 仅报告模式 :通过 Content-Security-Policy-Report-Only 头发送策略,违规行为仅上报至 report-uri 指定端点而不阻塞执行 强制执行模式 :使用 Content-Security-Policy 头,浏览器会直接拦截违规资源加载 混合模式:可同时设置两种头部,用于测试新策略影响 高级防护机制 严格动态 :通过 'strict-dynamic' 配合nonce机制,允许由已信任脚本动态加载的依赖资源 框架祖先限制 :使用 frame-ancestors 指令防止点击劫持,替代陈旧的X-Frame-Options头 升级请求 :通过 upgrade-insecure-requests 指令自动将HTTP资源请求升级为HTTPS 实际应用场景 对抗存储型XSS:禁止内联脚本执行,仅允许经过校验的外部脚本 防止数据泄露:通过 form-action 限制表单提交目标,阻止敏感数据发送至恶意端点 资源完整性保障:结合子资源完整性(SRI)哈希验证,确保外部资源未被篡改 策略优化实践 使用工具(如CSP分析器)自动提取页面资源依赖生成初始策略 通过浏览器开发者工具的CSP违规报告持续优化来源列表 采用非ce+严格动态的现代配置模式,避免维护静态域名白名单的复杂性