CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Web 与安全入门/课时/CSP 内容安全策略
RawBlame
课时目录12 节

Web 与安全入门

  1. 01Web 安全概览
  2. 02OWASP 风险
  3. 03SSL/TLS
  4. 04CORS
  5. 05CSP 内容安全策略
  6. 06服务器安全
  7. 07密码哈希
  8. 08Basic 认证
  9. 09令牌认证
  10. 10Cookie 认证
  11. 11SAML 简介
  12. 12综合练习

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-srcJS 来源(XSS 主战场)
style-srcCSS
img-src图片
connect-srcfetch / XHR / WebSocket
frame-ancestors谁可 iframe 本页(类似 X-Frame-Options)
object-src 'none'禁用 Flash 等插件

三种 script-src 策略(由严到松)

  1. 禁止内联(最安全):script-src 'self' —— 所有脚本外链文件
  2. nonce(推荐折中):服务端每请求生成随机 nonce,模板 <script nonce="...">
  3. 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。 下一课离开应用层,看服务器与运维基线。

加载本节练习…
← 上一课CORS下一课 →服务器安全