更深入的认识OR 1=1

OR 1=1 的本质是一个永真条件,它通过逻辑“或”运算让整个 WHERE 子句恒为真。

深入理解:

在 SQL 中,WHERE 子句就像一个过滤器:它会逐行检查表中的数据,只有满足条件的行才会被放入结果集。

  • 正常查询
    SELECT * FROM users WHERE username = 'admin' AND password = '123'
    只有当某一行的 username 列等于 'admin' password 列等于 '123' 时,这一行才会被返回。

  • 注入 OR 1=1
    SELECT * FROM users WHERE username = 'admin' OR 1=1 -- ' AND password = '...'
    条件变成了 (username='admin') OR (1=1)
    因为 1=1 永远为真,所以无论 username 是否等于 'admin',整个 WHERE 条件都对每一行求值为真。于是,表中的所有行都会被返回。

关键点:

OR 1=1 不会创造数据,它只是取消了对表中已有数据的过滤

  • 如果表里有数据(比如至少有一条用户记录),那么查询就会返回这些记录,登录验证代码看到有返回行,就认为用户存在,绕过成功。
  • 如果表里一条数据都没有(空表),虽然条件恒真,但因为没有行可以被“放行”,结果集依然是fetchArray() 拿不到任何东西,登录失败。

UNION SELECT 的区别:

  • OR 1=1修改过滤逻辑,影响的是“从原有表里选哪些行”。
  • UNION SELECT集合操作,它可以将你自己构造的新行直接追加到查询结果中,即使原表为空,也能强行制造出一行数据返回给应用。这就是为什么对付空表时,必须用 UNION 注入。

简言之,OR 1=1 的作用是“把门拆了,让所有已有的东西都出来”,但如果房间本来就是空的,门拆了也没东西出来;而 UNION SELECT 是“自己往房间里放东西,再把它拿出来”。

posted on 2026-07-26 02:39  misaki%20mei  阅读(0)  评论(0)    收藏  举报

导航