Web 安全入门:OWASP Top 10 速览

OWASP Top 10 是业界公认的 Web 应用十大风险清单。刚接触安全时最容易被那些缩写劝退,所以这一篇尽量用「人话」讲清楚每一类。

1. 失效的访问控制

是什么:该拦的地方没拦。比如把地址栏里的 ?id=1001 改成 1002,就能看到别人的订单。

怎么防:服务端每次请求都校验「这个资源属不属于当前用户」,不能只在前端把按钮藏起来——藏了不等于没有。

2. 加密机制失效

是什么:用了弱算法(MD5 存密码)、或者压根没上 HTTPS、或者证书校验被绕过。

怎么防:密码用 bcrypt / argon2;全站 HTTPS;敏感字段单独加密。

3. 注入

是什么:把用户输入拼进了命令里。最典型的是 SQL 注入:

1
2
3
-- 后端如果这么写就完了
SELECT * FROM user WHERE name = '" + input + "'
-- 输入 ' OR '1'='1 就能把所有用户查出来

怎么防:用参数化查询(Prepared Statement),永远不要手拼 SQL。ORM 默认就是参数化的。

4. 不安全的设计

这是 2021 版新增的,指的是「设计阶段就没考虑安全」——比如验证码可以无限次试、短信接口没有频率限制。这类问题靠打补丁修不好,得在设计时想清楚。

5. 安全配置错误

默认的口令没改、目录列表开着、报错信息把堆栈直接吐给用户、云存储桶设成了公开读。都属于这一类,而且极其常见。

6. 易受攻击的过时组件

还在用三年前的 Log4j / Struts / 老版本 Nginx。

怎么防:定期跑 npm audit、pip-audit、trivy,把依赖升级变成日常而不是救火。

7. 身份认证失效

弱口令、验证码可爆破、会话 ID 写在 URL 里、登录失败次数不限制。

怎么防:登录失败次数限制 + 多因素认证 + 会话超时。

8. 软件和数据完整性失效

反序列化漏洞、CI/CD 流水线被投毒、从不验证签名的自动更新。

9. 日志与监控不足

被打了还不知道,事后查不到是谁、什么时候、怎么进来的。

怎么防:登录失败、权限变更、异常参数都要记日志,并且日志要送到攻击者删不掉的地方。

10. SSRF(服务端请求伪造)

是什么:你让服务器去访问一个你给的 URL,结果它把内网也访问了一遍:

1
https://api.example.com/fetch?url=http://169.254.169.254/latest/meta-data/

上面这个地址在云主机上能拿到临时密钥。

怎么防:白名单允许访问的域名 + 禁止访问内网网段 + 禁用非常见协议。


一句话总结

类别 最短的防御动作
访问控制 每次请求都校验归属
加密 密码用 bcrypt,全站 HTTPS
注入 参数化查询
配置 关掉默认账户和目录列表
组件 定期npm audit
认证 失败次数限制 + MFA
SSRF 域名白名单 + 禁内网

安全不是一次性项目,是习惯。