大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
CSP 内容安全策略
XSS(跨站脚本) 让攻击者在用户浏览器里执行恶意 JS——可窃 Cookie、伪造请求、改页面。CSP(Content Security Policy) 通过响应头告诉浏览器:只允许从指定来源加载脚本、样式、图片等,即使某处注入 <script>,也会被浏览器拦截。纯 API 后端也应在 返回 HTML 或配合 BFF 渲染 时了解 CSP;Spring Boot 可统一加安全响应头。
学习目标
- 编写基础 CSP 指令,理解
default-src、script-src差异 - 使用 nonce 允许内联脚本而不过度放宽策略
- 配置 report-uri / report-to 收集违规报告(监控用)
CSP 如何工作
响应头示例:
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-abc123'; object-src 'none'; base-uri 'self'
浏览器加载资源前 对照白名单;违规可 拒绝 或 上报。
| 指令 | 作用 |
|---|---|
default-src | 其他类型未指定时的默认 |
script-src | JS 来源(XSS 主战场) |
style-src | CSS |
img-src | 图片 |
connect-src | fetch / XHR / WebSocket |
frame-ancestors | 谁可 iframe 本页(类似 X-Frame-Options) |
object-src 'none' | 禁用 Flash 等插件 |
三种 script-src 策略(由严到松)
- 禁止内联(最安全):
script-src 'self'—— 所有脚本外链文件 - nonce(推荐折中):服务端每请求生成随机 nonce,模板
<script nonce="..."> unsafe-inline(尽量避免):等于大幅削弱 CSP
后端渲染(Thymeleaf、JSP)或 Next.js SSR 可在 Controller / Filter 注入 nonce 到 Model 与 CSP 头。
Spring Boot 添加 CSP
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.headers(headers -> headers
.contentSecurityPolicy(csp -> csp
.policyDirectives("default-src 'self'; script-src 'self'; object-src 'none'"))
);
return http.build();
}
若前后端分离、API 只返回 JSON,CSP 主要在 静态站点 / 管理台 配置(Nginx 或 CDN)。API 仍应设:
X-Content-Type-Options: nosniff
防止浏览器 MIME 嗅探 把 JSON 当脚本执行(历史浏览器问题)。
report-uri 与监控
Content-Security-Policy: script-src 'self'; report-uri /api/csp-report
浏览器 POST 违规详情到该 URL。生产可:
- 专用端点写入日志 / SIEM
- 使用 Report-To(新规范,部分浏览器支持)
注意:report 端点可能收到 大量噪声,需限流与鉴权,避免被滥用 DoS。
CSP 不能替代什么
| CSP 能做 | CSP 不能做 |
|---|---|
| 限制脚本执行面 | 修复 SQL 注入 |
| 降低 XSS 危害 | 替代输出编码(仍要对用户输入转义) |
| 限制数据外传域名(connect-src) | 替代 sec-auth-cookie 的 HttpOnly |
输入校验 + 输出编码 + CSP 是 XSS 纵深防御。React/Vue 默认对文本插值转义,但 dangerouslySetInnerHTML、富文本编辑器仍是高危区。
与 API 后端的关系
- JSON API:Content-Type: application/json + 不返回 HTML 片段,降低反射型 XSS
- 文件下载:Content-Disposition: attachment 对不可信内容
- 错误页:生产 不要 把堆栈 HTML 返回给浏览器(见 sec-owasp A05)
管理端若用 Spring Boot 直出 HTML,CSP 与 sb-security 头配置应一并审查。
练习
- 在浏览器控制台故意触发 CSP 违规,观察 Network 里 report 请求(若有)
- 为「仅允许本站脚本 + 禁止 object」写一条 CSP 字符串
- 阅读 http-headers,列出除 CSP 外三个安全相关响应头
小结
CSP 是浏览器端的 XSS 安全带;script-src 从严,nonce 优于 unsafe-inline。 下一课离开应用层,看服务器与运维基线。