为什么是“像'A%'='A%';”搜索结果是否为“ A”?

时间:2019-07-22 23:23:29

标签: mysql

我一直在使用盲SQL注入技术测试一个搜索框。

当我想获得包含“ A”的帖子时,我只需在搜索框中提交字母A。但是,要获取所有帖子,我想使WHERE LIKE子句为真。

因此,我发布了A%'='A以使值正确。我期望SELECT * FROM list WHERE title LIKE 'A%'='A%';。但是它显示了所有包含字母“ A”的帖子。同样,当我发布A%'! =' A时,我得到的结果包括'A'

我不知道为什么会这样。

1 个答案:

答案 0 :(得分:1)

您的查询显然没有多大意义,但是MySQL会尽最大努力通过使用autocast来满足您的请求。

首先它将评估title LIKE 'A%'。这将返回一个true / falsy值,对于MySQL是10(整数)。

接下来,您强迫MySQL将这个整数与'A%'进行比较。 MySQL将尝试遵守该请求,并将此字符串转换为a 0 for you

所以LIKE 'A%'='A%'最终将与

相同
where (title LIKE 'A%') = 0

相同
where not (title LIKE 'A%')

返回所有不以A开头的标题。

类似地,LIKE 'A%'!='A%'将成为

where (title LIKE 'A%') != 0

相同
where (title LIKE 'A%')

因此您会获得所有 A开头的标题。

请不要忘记将该复选框的所有者告知always parametrize your inputs