客户端 Cross-site scripting CSP

客户端 Cross-site scripting CSP
最新回答
我这个你不爱的人

2026-06-19 15:50:38

CSP(内容安全策略)是一种专门用于防护XSS(跨站脚本攻击)的安全机制,其核心原理是通过限制页面加载资源的范围、控制脚本执行权限以及防止页面被非同源iframe嵌入,从而有效降低攻击风险。以下是CSP的核心机制、配置方法及防护效果的详细说明:

一、CSP的核心机制
  1. 资源加载限制

    通过default-src、script-src、style-src等指令限制资源加载来源。例如:

    Content-Security-Policy: default-src 'self'; script-src 'self'
    https://trusted.cdn.com
    此配置仅允许加载同源脚本及来自trusted.cdn.com的脚本。
  2. 内联脚本与动态代码控制

    'unsafe-inline':允许内联脚本(如<button onclick="...">),但会降低安全性。

    'unsafe-eval':允许eval()等动态代码执行,通常需禁用。

    nonce:通过服务器生成随机令牌,仅允许带有匹配nonce属性的脚本执行:

    <script nonce="随机值">alert('合法执行');</script>

    strict-dynamic(CSP3):允许已信任脚本动态加载其他脚本,需配合nonce或hash使用。

  3. 框架嵌入限制

    frame-ancestors:禁止页面被非同源iframe嵌入(防点击劫持):

    Content-Security-Policy: frame-ancestors 'self'效果等同于X-Frame-Options: SAMEORIGIN。
二、常见配置示例
  1. 基础防护(仅允许同源资源)

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

    阻止所有外部脚本、样式、图片等资源加载。

  2. 允许特定外部脚本

    Content-Security-Policy: script-src 'self'
    https://cdn.example.com
  3. 严格防护(禁用内联脚本与动态代码)

    Content-Security-Policy: script-src 'nonce-随机值' 'strict-dynamic'; default-src 'self'

    仅允许带nonce的脚本,且禁止通过内联事件(如onclick)执行代码。

  4. 通过<meta>标签配置

    <meta http-equiv="Content-Security-Policy" content="script-src 'self'; style-src 'self'">
三、CSP对XSS的防护效果
  1. 阻止外部脚本注入

    若配置为script-src 'self',攻击者注入的外部脚本(如<script src="恶意站点.com/xss.js"></script>)将被浏览器拦截。

  2. 限制内联脚本执行

    未配置'unsafe-inline'时,内联脚本(包括事件处理属性)无法执行。例如:

    <img src="x" onerror="alert(1)"> <!-- 无效 -->
  3. 动态代码防护

    禁用'unsafe-eval'后,eval()、setTimeout(字符串)等动态代码执行方式失效。

  4. 绕过难点

    nonce绕过:需预测或窃取服务器生成的随机值(极难)。

    strict-dynamic风险:若初始脚本可信,其动态加载的脚本也会被允许,需确保初始脚本安全。

四、其他安全建议
  1. 结合X-Frame-Options

    同时使用frame-ancestors和X-Frame-Options: SAMEORIGIN增强点击劫持防护。

  2. 报告违规行为

    通过report-uri指令收集CSP拦截记录:

    Content-Security-Policy: default-src 'self'; report-uri /csp-violations
  3. 逐步收紧策略

    初始使用Content-Security-Policy-Report-Only模式仅报告不拦截,确认无误后再强制执行。

五、总结

CSP通过白名单机制严格限制资源加载与脚本执行,是防御XSS的核心手段之一。合理配置(如禁用'unsafe-inline'、使用nonce)可显著提升安全性,但需注意:

  • 过度严格的策略可能导致功能异常,需测试兼容性。
  • 动态内容(如用户生成的HTML)需通过服务端净化(如DOMPurify库)或nonce标记处理。

(示意图:CSP拦截非白名单资源加载)