一、通俗理解
正常情况下:用户输入用户名 / 密码 → 程序拼接成合法 SQL → 数据库执行查询 → 返回正常结果。
SQL 注入情况下:用户输入带 SQL 语法的恶意内容 → 程序不加处理直接拼接 → 数据库执行了攻击者构造的恶意 SQL → 数据泄露、删库、脱库。
二、核心原理(最关键)
1. 漏洞根源
后端代码直接将用户可控的输入(如表单、URL 参数、Cookie)拼接成 SQL 语句,没有做任何过滤、转义或预处理。
这是 SQL 注入产生的唯一根本原因。
2. 攻击原理:闭合原有 SQL,插入恶意逻辑
后端原本的 SQL 是固定结构,攻击者通过输入特殊符号(' " ; -- #)提前闭合 SQL 字符串,然后插入自己的 SQL 逻辑。
3. 经典演示:登录漏洞
假设后端代码是危险写法(直接拼接):
//接收⽤户输⼊(登录⻚的账号密码) $name=$_POST['name'];POST⽅式:密码不暴露在URL,更安全
$pwd=$_POST['password'];
执⾏SQL查询(漏洞根源)
$sql="SELECT * FROM users WHERE name ='$name'AND password ='$pwd'"; $result=mysqli_query($conn,$sql;
正常输入:
name:admin password:123456
拼接后 SQL:
SELECT * FROM user WHERE name='admin' AND password='123456'
攻击者注入(无需密码登录)
输入:
name:admin' -- password:任意内容
拼接后最终 SQL 变成:
SELECT * FROM user WHERE name='admin' -- ' AND password='任意内容'
-
admin'闭合了前面的单引号,让用户名条件生效 -
--是 SQL 注释符,把后面的密码验证全部注释掉 -
结果:直接以管理员身份登录成功
三、注入的核心符号
这些是攻击者用来 “破坏” SQL 结构的关键:
| 符号 | 作用 |
|---|---|
' 或 " | 闭合字符串,打断原有 SQL 结构 |
-- | 注释后面所有 SQL 语句(最常用) |
# | 同上,注释(MySQL 专用) |
; | 结束当前 SQL,执行新的 SQL(堆叠注入) |
OR 1=1 | 构造永真条件,查询全部数据 |