CSP通过script-src等指令精准控制资源加载,'self'仅允同源外部脚本,禁内联脚本和eval,需用nonce或hash显式授权内联代码,配合report-only模式调试。

CSP 通过指令(Directives)和源表达式(Source Expressions)精准控制脚本、样式等资源的加载与执行方式,核心在于“只允许明确授权的运行行为”,而非笼统放行或禁止。
限制脚本执行来源与方式
脚本是 XSS 攻击的主要载体,script-src 指令直接决定哪些 JavaScript 可以执行:
-
'self':仅允许同协议、同域名、同端口的外部脚本(如
https://example.com/app.js),不包含子域名(api.example.com需单独添加) -
禁止内联脚本:默认不执行
<script>alert(1)</script>或<button onclick="doSomething()">—— 这是 CSP 防御 XSS 的关键一环 -
允许特定内联脚本:用
nonce-xxx(服务端每次生成唯一随机值)或sha256-xxx(对内联代码做哈希)显式授权,例如:script-src 'self' 'nonce-aBcDeF123';配合<script nonce="aBcDeF123">...</script> -
禁用 eval 类动态执行:不加
'unsafe-eval'时,eval()、setTimeout("alert(1)")、new Function()全部失效
控制样式与事件处理行为
CSS 和 HTML 事件属性同样可被滥用,需独立约束:
-
style-src 控制 CSS 加载源,同时默认禁止内联样式(
style="color:red")和<style>块;如需保留内联样式,必须显式添加'unsafe-inline'(不推荐)或使用nonce-/sha256- - default-src 'none' 可作为起点,再逐项放开必要类型,避免遗漏导致功能异常
-
禁止内联事件处理器:即使
script-src允许某源,onclick、onload等属性仍受 CSP 独立拦截(由浏览器强制执行)
隔离网络请求与嵌入内容
防止敏感操作被劫持或污染:
-
connect-src 限定
fetch、XMLHttpRequest、WebSocket的目标地址,避免前端无意中向恶意域名发送凭证 -
frame-src 或 child-src(CSP3)控制
<iframe>可嵌入的域名,防止点击劫持或第三方 iframe 注入恶意脚本 - form-action 严格限制表单提交地址,即使页面被注入伪造表单,也无法提交到攻击者服务器
启用报告机制辅助调试
上线前用 Content-Security-Policy-Report-Only 头试运行,配合 report-to 或旧版 report-uri 收集违规行为:
- 浏览器会拦截违规资源,但不阻断页面功能,只发送 JSON 报告到指定端点
- 报告包含违规指令、被阻止的资源 URL、触发的源、用户代理等,便于发现漏配或误配
- 确认无误后再切换为正式
Content-Security-Policy头生效

















