mysql中or和and使用的坑
user表:
where中可以包含任意数目的and和or操作符,在没有任何其他符号的时候,例如括号,SQL会首先执行and条件,然后才执行or语句
举例以下操作:
例1:
SELECT * FROM lt_user
WHERE
id=2 and phone=‘15936263992’
or
id=3 and phone=‘13718803009’
sql会首先执行or左右的两个and,类似以下sql,便于理解,并不会自动加括号,此处括号为了体现and的优先级
SELECT * FROM lt_user
WHERE
(id=2 and phone=‘15936263992’)
or
(id=3 and phone=‘13718803009’)
得到结果:
例2:
SELECT * FROM lt_user
WHERE
id=2 and phone=‘15936263992’
or
id=3 and phone=‘13718803009’
or
account > 666666
相当于以下sql,便于理解,并不会自动加括号,此处括号为了体现and的优先级
SELECT * FROM lt_user
WHERE
(id=2 and phone=‘15936263992’)
or
(id=3 and phone=‘13718803009’)
or
(account > 666666)
或者是以下3条sql的差集
SELECT * FROM lt_user WHERE id=2 and phone=‘15936263992’
SELECT * FROM lt_user WHERE id=3 and phone=‘13718803009’
SELECT * FROM lt_user WHERE account > 666666
得到结果:
例3:需求找id=6或者id等于9的并且account > 999999的数据
SELECT * FROM lt_user WHERE id=6 or id=9 and account > 999999
相当于以下sql,便于理解,并不会自动加括号,这样就得到错误的数据
SELECT * FROM lt_user WHERE id=6 or (id=9 and account > 999999)
or的大多情况应配合()使用,应改为以下sql
SELECT * FROM lt_user WHERE (id=6 or id=9) and account > 999999
得到正确结果:
例4:sql注入语句
SELECT * FROM bm_admin
WHERE
admin_id=1000 and admin_username=‘ad213n’
or
1=1;
此处 1=1,代表true,而在mysql中数据存在即为true,不存在才为false
执行为
SELECT * FROM bm_admin
WHERE
(admin_id=1000 and admin_username=‘ad213n’ )
or
1=1;
数据为 admin_id=1000 and admin_username=‘ad213n’ 或者 存在的数据,所以能获取所有数据。
以user表为例:
SELECT * FROM lt_user WHERE id=2 and phone=‘15936263992’ or 1=1
获取全表13条数据: