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