在 SQL 注入攻击中,1=1 被视为一个非常典型的特征,根本原因在于 1=1 是一个永远为真(恒真)的逻辑条件。
攻击者利用这个恒真条件,结合 SQL 语法的特性,来篡改应用程序原本的查询逻辑,从而达到绕过密码验证、窃取所有数据库数据的目的。
为了让你更直观地理解,我们可以剖析一下它的攻击原理:
- 正常的数据库查询逻辑
假设一个网站的后台登录代码是这样拼接 SQL 语句的:
python
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码'
只有当输入的用户名和密码在数据库中完全匹配时,数据库才会返回该用户的记录,系统才会允许登录。
- 注入 1=1 后的逻辑突变
如果攻击者在"用户名"输入框中输入这样一段精心构造的代码:
admin' OR 1=1 --
那么后台拼接出的 SQL 语句就会变成:
python
SELECT * FROM users WHERE username = 'admin' OR 1=1 --' AND password = '输入的密码'
3. 逐段解析攻击载荷 (Payload)
这段看似乱码的输入,其实每一步都有明确的目的:
' (单引号):它的作用是提前闭合程序预设的左单引号。这让后面的内容不再被当作单纯的文本字符串,而是逃逸出来,被当作 SQL 指令来解析。
OR (或者):逻辑运算符。只要 OR 两边有一个条件为真,整体结果就为真。
1=1:这是一个永远成立的数学等式(即 TRUE)。此时查询条件变成了 (username = 'admin') 或者 (TRUE)。根据逻辑运算规则,这会让整个 WHERE 语句的判断结果变为永远为真。
-- (注释符):在 SQL 语法中,-- 代表注释,它会把后面所有的代码(也就是程序原本用来验证密码的那部分语句)全部"抹除"废弃掉。
4. 最终结果
经过篡改,原本需要严格验证用户名和密码的语句,实际上变成了一条等同于 SELECT * FROM users 的指令。数据库会直接返回表中的所有用户数据(通常第一条就是超级管理员 admin)。攻击者根本不需要知道密码,就成功以管理员身份登录了系统。
为什么它是"明显特征"?
因为无论是自动化的安全扫描工具(如 SQLmap)还是人工测试,在探测一个网站是否存在漏洞时,通常都会发送 1=1(测试页面是否依然正常运行)和 1=2(测试页面是否报错或查不到数据)。通过观察这两种输入的响应差异,就能快速判断后台是否存在 SQL 注入漏洞。
因此,现代的网络应用防火墙(WAF)或安全防护设备,一旦检测到用户输入中包含 ' OR 1=1 这种经典的字符串模式,就会立刻将其判定为恶意攻击并进行拦截。
你可以通过下方这个模拟器,亲自体验一下正常登录与注入 1=1 时,后台 SQL 语句究竟发生了怎样的变化:
SQL 注入模拟演示
生成的 SQL 查询语句 (Dynamic SQL Preview)
正常:

注入:
