3rsh1
/single dog/college student/ctfer
3rsh1's Blog

mysql中or,and的组合逻辑分析

刚看到的一个比较有趣的文章,恰好晚上啥也不想做,就简单的写一下文章吧。

关于and和or的逻辑组合一共有七个测试语句。如下:

1.
mysql> select user,password from user where user='root' and sleep(5);
2.
mysql> select user,password from user where user='aaa' or sleep(5);
3.
mysql> select user,password from user where user='root' and host='localhost' or sleep(5);
4.
mysql> select user,password from user where user='root' or sleep(5) and host='localhost';
5.
mysql> select user,password from user where host='localhost' or sleep(5) and user='root';
6.
mysql> select user,password from user where host='localhost' or user='root' or sleep(5);
7.
mysql> select user,password from user where host='localhost' or false and user='root' and sleep(5);

其实之前在sql注入的部分里也提到过and和or的逻辑问题,但是当时没有考虑到如果and和or的逻辑组合到一起会是什么样子的,这里就简单写一下。在比赛中似乎也会遇到类似的题目。
这里先放一下mysql内运算符的优先级:

优先级 运算符
(最高)  !
 3     -(负号),~(按位取反)
 4     ^(按位异或)
 5     *,/(DIV),%(MOD)
 6     +,-
 7     >>,<<
 8     &
 9     |
10     =(比较运算),<=>,<,<=,>,>=,!=,<>,IN,IS NULL,LIKE,REGEXP
11    BETWEEN AND,CASE,WHEN,THEN,ELSE
12    NOT
13    &&,AND
14    XOR
15    ||,OR(最低)    =(赋值运算),:=

1.

https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_26be17091e81cf19d38d36c5c8c65803.jpg

可以看出来,总共是延时了15s,因为是一个and逻辑,遇到假的条件就中止。表内共有3条root的数据,也就是说当你查询user为root的时候,会先判断第一个条件是否成立,若是成立则会继续执行延时。故共有3条数据,共有3个延时。
那么为什么显示的内容为空呢?是因为where后面的是对表内的记录的限制条件,而sleep(3)显然并不是对于表内的数据的限制条件故为空。

2.

https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_e5fe8626323b24943bb73d47c1707815.jpg

or逻辑的话,是遇到真的就中止,至少有一个条件为真才会执行条件。首先会在表内查询user为root的记录,共有三条记录。对了,这里可能要说一下,mysql的查询中若是有限制条件的话,是逐个筛选表内的内容的。那么说明这三条记录其实是不产生延时的,那么剩下的那条记录就会产生延时5s。
为什么会出现三条记录就很容易理解了,因为or逻辑的话,只要满足其中的一个条件即可,不必在意sleep(3)的这个条件。

3.

https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_1894ae3fa586954f0925555c166a2410.jpg

这里就涉及到运算符优先级的问题了,and的优先级是比or的优先级要高的,也就是说会先判断and逻辑是否为真。
https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_d482be47bd782cdab232100d928a99f0.jpg

图中的例子很明晰了。先判断and逻辑,1 and 1 为真即 1,1 or 0 为 真即 1。
那么上面的例子中首先会在表内查找user=root和host=localhost的记录,但是这样的记录只有一条,那么筛选剩下的三条记录的时候user=root and host=localhost为假,会执行后面的延时故为15s。而且也只会显示一条符合条件的记录。

4.

https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_982af7eb74675053d0674757d960f135.jpg

这里的因为总体上是个or逻辑,就直接先看or的第一个逻辑user=root。因为表中满足第一个条件的有三条记录,这三条记录不会产生延时。那么只有剩下的那条记录才会导致总体的or逻辑进行到第二个条件,因为第二个条件是一个and逻辑,它的真假已经不重要了,因为or逻辑没有第三个条件。
补充:
https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_1242cb1609d32e79ca6e8dc1e03782ca.jpg

其实写到这里的时候就莫名想起一个问题,因为之前提到的where是逐条记录筛选的,那么对于where后面跟的若干条件,是不是逐个条件筛选的呢,即先筛选出来满足第一个条件的记录,然后再在满足第一个条件的记录里面筛选满足第二个条件的记录,以此类推。放到sql语句中来理解的话就是:条件是根据优先级由左向右判断的,且总体的真假只是影响最后结果的显示。这里用集合的思想来理解尤为清晰,and是交运算,or是并运算。
验证例子如下:
https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_86d14c6c3ac388b877fdfa1c06fb7e43.jpg

补充结束。
这里执行到第二个条件的时候会先执行sleep(5)然后判断是否host为localhost但是因为这是一个and逻辑需要同时满足and的两个条件,和第一个问题差不多显然是不满足的,故最后一条数据不显示。仅显示user为root的三条记录。

5.

第五个问题的理解和第四个问题的理解是相同的。

6.

https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_e8770fea143e775acc72b3c6deb2ca98.jpg

or是只满足一个条件即可,当不满足user为root,会继续下一个条件,看是否host为localhost,当不是localhost时才会延时。

7.

https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_a4cf8e888b34172134815fb5e9a22973.jpg

会先判断host是否为localhost若不是的话,会执行第二个条件,但是第二个条件中的第一个小条件就为false,故第二个条件中的其余小条件都不会执行也不会延时。所以输出的内容仅仅是满足第一个条件的记录。

xor:

这里补充一下xor的逻辑:

https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_16e563c82645e5a75e7dfbe0658d0d21.jpg

https://www.3rsh1.cool/wp-content/uploads/2020/07/wp_editor_md_b51387feb25bea2dfd290bb072402ba7.jpg

参考链接(需要梯子):

https://www.admintony.com/MySQL%E7%9A%84%E9%80%BB%E8%BE%91%E8%BF%90%E7%AE%97%E7%AC%A6-and-or-xor-%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%9C%BA%E5%88%B6.html

发表评论

textsms
account_circle
email

3rsh1's Blog

mysql中or,and的组合逻辑分析
刚看到的一个比较有趣的文章,恰好晚上啥也不想做,就简单的写一下文章吧。 关于and和or的逻辑组合一共有七个测试语句。如下: 1. mysql> select user,password from user where us…
扫描二维码继续阅读
2020-07-21