SQL Injection SQL 注入
在数据库上执行意外 SQL 查询的攻击。利用 web 应用直接把用户输入拼进 SQL 字符串的坏习惯,把恶意 payload 当代码执行。
OWASP Top 10 上的老牌冠军,2003 年至今没掉出过前三。
经典例子
登录表单后端写成这样:
SELECT * FROM users WHERE name = '$input' AND password = '$pwd';攻击者在用户名框输入 admin' --,SQL 变成:
SELECT * FROM users WHERE name = 'admin' --' AND password = '...';-- 后面被注释掉,密码检查直接跳过,以 admin 身份登录。
攻击者能做什么
- 读取 整张表(用户、订单、密码 hash)
- 篡改 数据(改余额、改权限)
- 删除 整个数据库
- 提权 到 OS shell(某些数据库可以)
防御(按效力排)
| 措施 | 说明 |
|---|---|
| Prepared Statements / 参数化查询 | 把 SQL 结构和数据分开,根治 |
| ORM | 大多数 ORM 默认参数化,但拼字符串还是会中招 |
| Input validation | 白名单校验,但不能单独靠这个 |
| 最小权限数据库账号 | 应用账号别给 DROP / DELETE |
| WAF | 第二道防线,不是第一道 |
不要做的事
- 字符串拼接 SQL —— 任何语言、任何场景
- 把”过滤特殊字符”当主要防御 —— 永远漏一种 encoding