MySQL中的运算符优先级和类型转换(WHERE子句中有多个比较运算符)

时间:2019-04-18 18:08:49

标签: mysql

我是Pentest的新手,对MySQL的运算符优先级和类型转换有疑问。 (WHERE子句中有多个比较运算符)

表结构如下所示(DVWA用户表):

user_id int(6) 
first_name varchar(15) 
last_name varchar(15) .....

我测试了以下查询的结果(在MySQL 5.7中)。 (P.S.这些查询用于绕过或只是为了娱乐)

SELECT * FROM users WHERE user_id = 1&1=1;

SELECT * FROM users WHERE user_id = 1&1=0;

SELECT * FROM users WHERE user_id = 0&1=0;

SELECT * FROM users WHERE user_id = 1&0=1;

第一个查询返回1条记录(user_id = 1),第二个查询返回除user_id = 1以外的所有记录。第三个返回所有记录,最后一个不返回记录。

前四个查询具有相同的输出,后四个查询具有相同的输出,因为按位与(&)的优先级最高:

SELECT * FROM users WHERE user_id = 1=1;

SELECT * FROM users WHERE user_id = 1=0;

SELECT * FROM users WHERE user_id = 0=0;

SELECT * FROM users WHERE user_id = 0=1;

我的问题是:两次比较的优先顺序是什么? (因为boolean是tinyint(1),并且在比较int(6)和tinyint(1)时不应进行任何转换,不像比较string和int)最后,我还要测试SELECT * FROM users WHERE user_id = 0<1;SELECT * FROM users WHERE user_id =0=1=0;得到的结果与第三个相同。 在我看来真的很奇怪。 谢谢大家的帮助。

0 个答案:

没有答案