OWASP Top 10
用业界标准的十大最关键 Web 应用风险列表作基线清单。
为什么
OWASP Top 10 不是随机列表——它是数千报告漏洞的共识,每三四年更新,排实际应用中真出现的风险。把它当基线清单确保发布前至少考虑了十个最可能攻击向量。它是应用安全的通用语:审计员、渗透测试师、合规框架(PCI-DSS、SOC 2)都引用它,把你的控制映射到 Top 10 使安全审查和审计更快更对齐。跳过它意味着你只防你碰巧知道的非实际破坏应用的漏洞。
何时使用
每个新项目开始和每次大发布后审查当前 Top 10。把每项映射到具体控制或文档化的接受风险。列表更新时(每 3-4 年)重审。
如何做
1. 读当前 Top 10(撰写时为 2021 版)理解每个风险 - A01 访问控制失效、A02 加密失效、A03 注入 - A04 不安全设计、A05 安全配置错误、A06 易受攻击组件 - A07 认证失效、A08 软件/数据完整性失效、A09 日志/监控、A10 SSRF 2. 每项映射到应用中具体控制 - A01 → 每个 API 端点检查调用者拥有该资源 - A03 → 所有查询用参数化输入(无字符串拼接) - A06 → 每个 PR 自动依赖扫描(Snyk/Dependabot) - 若无控制,建一个或文档化接受风险 3. 跑映射到 Top 10 的自动扫描器 - SAST(Semgrep/CodeQL)查 A01/A03/A04,依赖扫描查 A06 - DAST(ZAP)查 A05/A07,密钥扫描查 A02,日志审计查 A09 4. 把映射记入安全控制矩阵 - 每个 Top 10 项一行,列: 控制、工具、状态、上次审查 - 这矩阵是审计证据和修复缺口追踪器 5. 每季和 Top 10 更新时重审 - 新版可能加风险(SSRF 2021 加入)——评估每个新项 - 追踪哪些控制已实现、进行中、或接受风险
示例
# docs/security/owasp-controls-matrix.md | OWASP | 风险 | 控制 | 工具 | 状态 | |-------|-----------------|-------------------------------|-------------|--------| | A01 | 访问控制失效 | 每请求授权中间件 | Semgrep | ✅ | | A02 | 加密失效 | 无硬编码密钥,TLS 1.3 | gitleaks | ✅ | | A03 | 注入 | 仅参数化查询 | Semgrep | ✅ | | A04 | 不安全设计 | 每功能威胁模型 | 手动 | 🟡 | | A05 | 安全配置错误 | CI 中 CIS 基准扫描 | kube-bench | ✅ | | A06 | 易受攻击组件 | 每 PR Dependabot + Snyk | Snyk | ✅ | | A07 | 认证失效 | MFA、限流、bcrypt(12) | ZAP | ✅ | | A08 | 完整性失效 | 签名提交、固定哈希 | cosign | 🟡 | | A09 | 日志/监控 | 结构化日志、告警 | Datadog | ✅ | | A10 | SSRF | 出站允许列表、无原始 fetch | Semgrep | ✅ | # 这矩阵是"我们覆盖 Top 10 了吗"的唯一事实源。
常见问题
- ⚠把 Top 10 当一次性清单勾完就忘——风险演进,新攻击技术出现,去年有效的控制(正则输入过滤)可能被新技术(多载荷)绕过。
- ⚠每项都映射到"我们有 WAF"给虚假信心——WAF 是补偿控制抓已知模式,非在源头修访问控制或用参数化查询的替代。
- ⚠只聚焦前 3(注入、XSS、访问控制失效)忽略 A09(日志/监控)意味着可能被入侵数月不知,因为检测缺口和预防缺口一样危险。
- ⚠记矩阵但从不验证控制真有效——矩阵写"我们有参数化查询"而 Semgrep 扫描在生产代码中找到三个字符串拼接查询。
最佳实践
- ✓每个 Top 10 项映射到主控制(源头修)和检测控制(日志+告警)——预防会失败,你需要知道何时。
- ✓自动化验证: CI 中每个 PR 跑 Semgrep、Snyk、ZAP,新发现即构建失败——不持续验证的控制是已静默腐烂的控制。
- ✓新版发布时(每 3-4 年)重读 Top 10 并对每个新或重定义风险评估你的代码库——2021 版加了 SSRF 和不安全设计,很多团队从未显式考虑过。
- ✓把控制矩阵分享给全团队非仅安全负责人——开发者需知哪些控制存在及为何,以免新代码无意绕过它们。