纠正说明sql注入中位运算符的使用

//2、管道符的使用

//不清楚。。。现在已知的:

//1、order by之后可以使用|数字使排序错乱,不清楚具体是怎么错乱的

//2、where子句之后跟上|1|0也能出数据,但要是跟上|大于一或小于零的数就出不了数据

(以上注释符?表示内容不作数,同时保留曾经的错误内容以表示这是个坑)

首先感谢cL0und师傅,这个点我终于弄明白了,万万没想到是这种逻辑

纠正之前的两个说法:

第一,符号|在这里不是管道符,是mysql按位或运算

第二,排序并没有错乱,只是看上去错乱了,其本质仍是从小到大或从大到小排列

msql的位运算符有以下三个:

之前提到的排序“错乱”语句的基本构造如下:

这个语句其实mysql是这样理解的:

现在来说明其原理

在我们下达order by num指令时,sql并非对num进行直接排序,而是生成一个类似于字典的键值对进行排序,结构如下所示;

这里就有一个问题,同样都是1234,sql却会对作为key的1234进行排序。由于这里key和value都是1234,因此不会造成任何影响。但是下面那这种情况就不同了:

那么相当于:

我们再将其按key进行从小到大的排序看看,这样就会变成:

好了我们回头看实际的输出:

果然是2134,同理其它位运算符会产生相同的效果。

总结一下:

1、mysql不会直接对结果集中的参数进行排序,而是生成一个键值对后对其中的键进行排序

2、当然这只是一种理解方式,从最根本的层面理解的话可能不是这么回事,但是总得用语言把这种现象描述出来才行(逃)。

Leave a Reply

Your email address will not be published. Required fields are marked *