SQL注入漏洞的基本原理

4 阅读2分钟

一、通俗理解

正常情况下:用户输入用户名 / 密码 → 程序拼接成合法 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构造永真条件,查询全部数据