2026-06-19 15:50:38
CSP(内容安全策略)是一种专门用于防护XSS(跨站脚本攻击)的安全机制,其核心原理是通过限制页面加载资源的范围、控制脚本执行权限以及防止页面被非同源iframe嵌入,从而有效降低攻击风险。以下是CSP的核心机制、配置方法及防护效果的详细说明:
一、CSP的核心机制资源加载限制
通过default-src、script-src、style-src等指令限制资源加载来源。例如:
Content-Security-Policy: default-src 'self'; script-src 'self'内联脚本与动态代码控制
'unsafe-inline':允许内联脚本(如<button onclick="...">),但会降低安全性。
'unsafe-eval':允许eval()等动态代码执行,通常需禁用。
nonce:通过服务器生成随机令牌,仅允许带有匹配nonce属性的脚本执行:
<script nonce="随机值">alert('合法执行');</script>strict-dynamic(CSP3):允许已信任脚本动态加载其他脚本,需配合nonce或hash使用。
框架嵌入限制
frame-ancestors:禁止页面被非同源iframe嵌入(防点击劫持):
Content-Security-Policy: frame-ancestors 'self'效果等同于X-Frame-Options: SAMEORIGIN。基础防护(仅允许同源资源)
Content-Security-Policy: default-src 'self'阻止所有外部脚本、样式、图片等资源加载。
允许特定外部脚本
Content-Security-Policy: script-src 'self'严格防护(禁用内联脚本与动态代码)
Content-Security-Policy: script-src 'nonce-随机值' 'strict-dynamic'; default-src 'self'仅允许带nonce的脚本,且禁止通过内联事件(如onclick)执行代码。
通过<meta>标签配置
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; style-src 'self'">阻止外部脚本注入
若配置为script-src 'self',攻击者注入的外部脚本(如<script src="恶意站点.com/xss.js"></script>)将被浏览器拦截。
限制内联脚本执行
未配置'unsafe-inline'时,内联脚本(包括事件处理属性)无法执行。例如:
<img src="x" onerror="alert(1)"> <!-- 无效 -->动态代码防护
禁用'unsafe-eval'后,eval()、setTimeout(字符串)等动态代码执行方式失效。
绕过难点
nonce绕过:需预测或窃取服务器生成的随机值(极难)。
strict-dynamic风险:若初始脚本可信,其动态加载的脚本也会被允许,需确保初始脚本安全。
结合X-Frame-Options
同时使用frame-ancestors和X-Frame-Options: SAMEORIGIN增强点击劫持防护。
报告违规行为
通过report-uri指令收集CSP拦截记录:
Content-Security-Policy: default-src 'self'; report-uri /csp-violations逐步收紧策略
初始使用Content-Security-Policy-Report-Only模式仅报告不拦截,确认无误后再强制执行。
CSP通过白名单机制严格限制资源加载与脚本执行,是防御XSS的核心手段之一。合理配置(如禁用'unsafe-inline'、使用nonce)可显著提升安全性,但需注意:
