CSP 内容安全策略
防 XSS、nonce 与 report-uri。
30 分钟
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 仍应设: