大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
OWASP 风险
OWASP Top 10 是 Web 应用 最常见、影响最大 的风险清单,不是漏洞百科全书,而是 优先级指南。后端开发应能 看到代码或 API 设计就联想到对应条目,并在 Code Review 里主动问一句。
学习目标
- 说出当前 Top 10 中 与 Java API 最相关的五条 及典型场景
- 在 Spring / MyBatis 栈里识别注入、越权、错误配置的代码 smell
- 知道何时深入 spring-boot-essentials 与 oauth-essentials
Top 10 与后端直觉(2021 版框架)
| 风险 | 一句话 | Spring 栈常见表现 |
|---|---|---|
| A01 访问控制失效 | 能调接口 ≠ 有权调 | 缺 @PreAuthorize、仅藏 UI 不校验 API |
| A02 加密机制失效 | 该加密的地方没加密 | HTTP 传密码、弱哈希、硬编码 AES key |
| A03 注入 | 把输入当代码执行 | SQL 拼接、LDAP/命令注入、不安全反序列化 |
| A04 不安全设计 | 架构层面缺控制 | 无速率限制、无多租户隔离设计 |
| A05 安全配置错误 | 默认配置上线 | 开启 actuator 全开、debug 堆栈回客户端 |
| A06 易受攻击组件 | 依赖有已知 CVE | 旧版 Spring、Log4j、未跑 mvn dependency-check |
| A07 身份认证失效 | 登录与会话设计错误 | 弱密码策略、JWT 无过期、session 固定 |
| A08 软件与数据完整性 | 更新链被篡改 | 从不校验的 URL 拉脚本、CI 密钥泄露 |
| A09 日志与监控不足 | 被打了不知道 | 无登录失败告警、无审计谁改了权限 |
| A10 SSRF | 服务端替攻击者发请求 | url 参数拉内网 metadata |
不必背编号,要背 「这类 bug 在我仓库里长什么样」。
A01 访问控制:最高频后端事故
水平越权:用户 A 改 orderId=123 为 124 读到他人订单。
垂直越权:普通用户调用 /admin/users。
防御习惯:
// 坏:只信路径里的 userId
@GetMapping("/users/{userId}/orders")
List<Order> list(@PathVariable Long userId) { ... }
// 好:与当前登录主体比对
Long current = SecurityContextHolder.getContext()...;
if (!userId.equals(current) && !isAdmin()) throw new AccessDeniedException();
资源级校验应放在 Service 层,不要只依赖 Controller 路径「看起来合理」。
A03 注入:MyBatis 典型坑
<!-- 危险:${} 直接替换,用户输入可改 SQL 结构 -->
<select id="search">SELECT * FROM user WHERE name = '${name}'</select>
<!-- 安全:#{} 预编译参数 -->
<select id="search">SELECT * FROM user WHERE name = #{name}</select>
JPA @Query 里拼 % 也要注意 只用参数绑定。ORM 不是银弹,原生 SQL 片段 仍要人工审查。
A07 认证:与后续课时衔接
- 密码存储 → sec-hash
- Cookie / Token → sec-auth-cookie、sec-auth-token
- 联邦登录 → oauth-essentials、sec-saml
「认证通过」只解决 你是谁;Top 10 里大量事故是 授权(你能干什么) 没做好。
A05 / A06:配置与依赖
Spring Boot 常见误配置:
| 误配置 | 风险 |
|---|---|
management.endpoints.web.exposure.include=* | actuator 信息泄露 |
spring.jpa.show-sql=true 上生产 | SQL 与数据进日志 |
默认 admin/admin 未改 | 直接沦陷 |
| 忽略 Dependabot / OWASP Dependency-Check | 已知 CVE 长期存在 |
最小暴露:生产只开 health;敏感端点加 IP 白名单或关闭 web 暴露。
开发流程里怎么落地
- PR 模板加一条:「是否涉及用户输入、权限、密钥?」
- 静态扫描:SpotBugs、Sonar、dependency-check 进 CI
- 威胁建模(轻量):新接口问「攻击者能传什么?能访问谁的数据?」
- 对照 sb-validation:输入校验是注入与业务逻辑漏洞的第一道门
练习
- 在任意开源 Spring 项目 GitHub 搜
ORDER BY ${或like '%${,理解为何危险 - 列出你当前项目三个 API,分别写「可能的 A01 / A03 场景」
- 阅读 oauth-security 中与 redirect、token 相关的条目,与 A07 对照
小结
OWASP Top 10 是 Review checklist,不是合规盖章。 下一课从传输层机密性入手:TLS 与 HTTPS。