CSP 是一种浏览器强制执行的白名单式安全策略,通过 http 头或 meta 标签限制资源加载以防止 xss。需禁用内联脚本与 eval、改用 事件 监听、显式声明第三方域名,并配合服务端转义等其他防护措施。

javaScript CSP(Content Security Policy,内容安全策略)是一种浏览器安全机制,用来限制网页中可以加载和执行的资源,核心目标是防止跨站脚本攻击(XSS)。它不依赖代码层的过滤或转义逻辑,而是通过 HTTP 响应头或 <meta> 标签,由浏览器强制执行“白名单式”资源控制。
什么是 CSP 策略?
CSP 是一套声明式的规则,告诉浏览器哪些脚本、样式、图片、iframe、字体等资源允许加载,哪些不允许。例如,禁止内联脚本(<script>alert(1)</script>)和 eval(),只允许从指定域名加载外部 js 文件。
典型响应头示例:
Content-Security-Policy: script-src ‘self’ https://cdn.example.com; Object-src ‘none’; base-uri ‘self’;
- script-src ‘self’:只允许同源脚本(如
<script src="/app.js"></script>) - script-src https://cdn.example.com:额外允许从该 CDN 加载 JS
- script-src ‘unsafe-inline’:⚠️ 不推荐!会重新打开 XSS 通道(禁用内联脚本是 CSP 防 XSS 的关键)
- object-src ‘none’:禁用
<object></object>、<embed></embed>、<applet></applet>,防止 Flash/Java 类型的旧式攻击
如何用 CSP 有效防止 XSS?
单纯加个 CSP 头不够,必须配合开发习惯调整。重点在于切断 XSS 的常见执行路径:
立即学习“Java 免费学习笔记(深入)”;
- 移除所有内联事件 处理器,比如
<button onclick="doSomething()"></button>→ 改用 JS 绑定addEventListener - 避免内联脚本块,把
<script>var data = <%= user_input %>;</script>改成通过data-属性或 API 接口 传数据 - 禁用
eval()、setTimeout(String)、setInterval(string)、function(string)等动态代码执行方式 - 对 json 数据使用
JSON.parse()而非eval(),服务端返回时确保 Content-Type 为application/json
实际部署建议
不要一步到位启用严格策略,先用 Content-Security-Policy-Report-Only 头收集违规行为:
Content-Security-Policy-Report-Only: script-src ‘self’; report-uri /csp-report
- 浏览器不会阻断违规资源,但会向
/csp-report发送 JSON 报告,帮你发现遗漏的合法资源 - 上线前在真实环境跑 3–7 天,根据报告逐步收紧策略
- 对第三方 SDK(如统计、广告、埋点脚本),显式列出其域名,不要用通配符(
https://*.google.com)或宽泛协议(http:) - 避免滥用
'unsafe-eval'—— vue/react 的模板编译、webpack 的 eval devtool 都可能触发它,生产环境应关闭
补充:CSP 不是万能的
CSP 主要防“执行”,不防“注入”。仍需坚持基础防护:
- 服务端对用户输入做上下文敏感的转义(html、JS、URL、css 各有不同规则)
- 使用现代框架(React/Vue/Svelte)的默认 HTML 转义机制,但注意
dangerouslySetInnerHTML或v-html这类绕过接口 - 设置
HttpOnly+Securecookie,防止 XSS 窃取 session - 配合
X-XSS-Protection: 0(现代浏览器已弃用,可忽略)和X-Content-Type-Options: nosniff增强防护纵深
基本上就这些。CSP 是 XSS 防御的关键一环,但必须和其他措施配合,且需要适配 前端 工程实践。不复杂,但容易忽略细节。
以上就是