如果 vibe-coder 只能记住一份 web 安全清单,就记 OWASP Top 10。它不是”高级渗透技巧”,是最常见的 10 类翻车现场——99% 的网站被攻破,都没跳出这 10 条。
这一篇放在 IAM 那一篇之后,因为 Top 10 的第 1 名就是”访问控制失效”——直接对应 IAM 没做好。
顶层结论
- OWASP 是非营利组织,所有产物免费开源,业界标准
- Top 10 每 3-4 年更新一版,当前是 2021 版(2025 版仍在草案)
- vibe-coder 用法:让 AI 写完代码后,逐条对照 Top 10 自查——这比单元测试更能挡安全事故
速查表(先看这个)
| # | 名字 | 一句话 | vibe-coder 最易踩 |
|---|---|---|---|
| A01 | Broken Access Control | 看了不该看的 | API 不检查 owner |
| A02 | Cryptographic Failures | 加密用错了 | 用 MD5 存密码 |
| A03 | Injection | 输入直接拼命令 | SQL 字符串拼接 |
| A04 | Insecure Design | 设计就不安全 | 6 位邀请码 |
| A05 | Security Misconfig | 配置错了 | 生产开 DEBUG |
| A06 | Vulnerable Components | 第三方包过期 | 不跑 audit |
| A07 | Auth Failures | 登录系统弱 | 自己写登录 |
| A08 | Integrity Failures | 来源没校验 | CDN 不加 SRI |
| A09 | Logging Failures | 出事看不见 | 不记权限拒绝 |
| A10 | SSRF | 替攻击者发请求 | 用户输 URL 不过滤 |
下面逐条展开,需要细节再往下看。
OWASP 是什么
Open Worldwide Application Security Project——开放全球应用安全项目。
- 形态:非营利基金会,全球志愿者社区
- 产物:全部 免费 + 开源
- 影响力:几乎每个 web 安全岗 JD 都写”familiar with OWASP Top 10”
几个常被引用的 OWASP 产出
| 名字 | 是什么 |
|---|---|
| Top 10 | web 应用最高危 10 类漏洞,行业事实标准 |
| Top 10 for LLM | 大模型应用的 Top 10(prompt injection 等) |
| ASVS | 应用安全验证标准,做 audit / 合规用 |
| Cheat Sheet Series | 每个具体技术(JWT、CORS、Session…)一张速查 |
| ZAP | 开源 web 漏洞扫描器,和商业产品同级 |
| SAMM | 软件保证成熟度模型,衡量团队 AppSec 成熟度 |
OWASP Top 10(2021 版)逐条解释
按风险从高到低,每条配:它在说什么 / AI 容易踩在哪 / 怎么自查。
A01:2021 — Broken Access Control(访问控制失效)
在说什么:用户能访问不该访问的东西。例如登录后直接改 URL 里的 ?user_id=1 看到别人的资料。
AI 容易踩:写 API 时只检查”登录了没”,不检查”这个东西归不归你”。
自查:每个返回数据的接口,问一遍——这个资源的 owner 是不是当前用户? 如果不是,有没有显式授权?
参考 IAM 文章里的 RBAC。
A02:2021 — Cryptographic Failures(加密失败)
在说什么:该加密的数据没加密、或者加密用错了算法。
AI 容易踩:用 MD5 / SHA-1 存密码、HTTP 传敏感数据、密钥写死在代码里。
自查:
- 密码存的是 bcrypt / argon2,不是 SHA-256(参考 hash 文章)
- 全站强制 HTTPS
- 密钥放 环境变量 / secret manager,不在 git 里
A03:2021 — Injection(注入攻击)
在说什么:把用户输入直接拼到 SQL / shell / LDAP 命令里——攻击者把命令塞进输入框。最典型是 SQL Injection 和 XSS。
AI 容易踩:"SELECT * FROM users WHERE name='" + userInput + "'"——经典死法。
自查:看 AI 写的数据库查询是不是用 参数化查询 / prepared statement,看 HTML 渲染是不是 escape 了用户输入。
A04:2021 — Insecure Design(设计就不安全)
在说什么:不是 bug,是设计错了。例如”忘了密码”用手机号验证,但手机号可以随便改——再多代码 review 也救不了。
AI 容易踩:做”邀请码”系统时,邀请码用 6 位数字——攻击者直接 brute force。
自查:写代码前先画 threat model——这个流程谁可能滥用?攻击者最便宜的攻击是啥?
A05:2021 — Security Misconfiguration(配置错误)
在说什么:用了默认密码、开了 debug 模式上线、错误信息把 stack trace 泄露给用户。
AI 容易踩:.env 提交到 git、生产服务器开着 DEBUG=True、CORS 配成 *。
自查:
- 生产环境 DEBUG 必须关
- CORS 不能用
*,必须白名单 .env在.gitignore里- 默认账号密码全改掉(数据库 root、admin 面板)
A06:2021 — Vulnerable and Outdated Components(用了有漏洞的第三方组件)
在说什么:你的代码没漏洞,但你 npm install 的包有漏洞。
AI 容易踩:装一堆三年没更新的依赖,从来不跑 audit。
自查:
- 定期跑
npm audit/pip-audit/cargo audit - 用 Dependabot / Renovate 自动 PR 升级
- 砍掉所有”看着用一次就再没碰过”的依赖
A07:2021 — Identification and Authentication Failures(认证失效)
在说什么:登录系统弱——密码可以暴力破解、session 不过期、忘了密码功能可被绕过。
AI 容易踩:自己实现登录、session 永不过期、登录失败次数不限制。
自查:别自己写登录——用 SSO / IdP(参考 SSO+MFA 文章)。如果一定要自己写:加 rate limit、加 MFA、session 设过期。
A08:2021 — Software and Data Integrity Failures(完整性失效)
在说什么:代码或数据来源没校验。例如从 CDN 加载 <script> 没加 SRI、CI/CD 的部署 token 被偷、用 pickle.loads 反序列化不可信数据。
AI 容易踩:让 <script src="https://some-cdn.com/lib.js"> 直接上,没加 integrity= 校验。
自查:
- 外部 JS 加 SRI(Subresource Integrity)
- 反序列化只接受白名单类型
- CI/CD 的密钥用 OIDC 短期凭据,不是写死的 long-lived token
A09:2021 — Security Logging and Monitoring Failures(日志和监控失效)
在说什么:出事了你根本不知道。没日志 = 没线索 = 没法响应。
AI 容易踩:登录失败、权限拒绝、敏感操作通通不记日志。
自查:至少记这四类——
- 登录成功 / 失败(含 IP)
- 权限拒绝
- 敏感操作(改密码、改邮箱、删数据)
- 服务端错误(5xx)
参考 日志。
A10:2021 — Server-Side Request Forgery (SSRF)
在说什么:让服务器替你发请求——攻击者借此扫内网、访问 cloud metadata 服务偷凭据。
AI 容易踩:写”输入 URL 我帮你抓预览”功能时,不过滤目标地址——攻击者输入 http://169.254.169.254/ 拿到 AWS 临时凭据。
自查:
- 用户能输入的 URL 必须白名单,或至少黑名单内网网段(
127.0.0.0/810.0.0.0/8169.254.0.0/16) - 云上跑的服务,禁用 IMDSv1,只用 IMDSv2
概念关联
这一篇放在系列里
- 上一篇:IAM — 谁能干什么
- 上上篇:SSO + MFA — 认证两件套
- 上上上篇:PII 4 条铁律 — 数据怎么放
- 课程主页:Assets, Threats, and Vulnerabilities