为什么WHERE“”=“”是真的?

时间:2015-09-30 20:53:14

标签: sql select sql-injection

很抱歉,如果这看起来像一个愚蠢的问题,但我正在阅读有关SQL注入和所提到的这种状态之一的SQL命令,如

SELECT * 
FROM Users 
WHERE Name ="" or ""="" 
AND Pass ="" or ""=""

将有效并返回表用户的所有记录。我理解做

之类的事情背后的逻辑
SELECT * 
FROM Users 
WHERE UserId = 105 or 1=1

但我似乎无法弄清楚为什么""=""会成为真实的陈述。我对SQL很新,我已经搜索了一个答案,但大多数SQL注入的例子只提到了1 = 1的例子。

4 个答案:

答案 0 :(得分:4)

  

我似乎无法弄清楚为什么""=""会成为真实的陈述。

空字符串等于另一个空字符串。不确定混乱在哪里。

  

我已经搜索了一个答案,但大多数SQL注入的例子只提到了1 = 1的例子。

这只是处理附加引号的另一种方式。原始代码可能类似于

string sql = 'SELECT * FROM Users WHERE Name ="' + username + '" AND Pass ="' + password + '"'

因此传入值'" or ""="'会导致您看到的字符串。

有时您看到的另一个是传递值'" OR 1=1 --',这会导致SQL

SELECT * FROM Users WHERE Name ="" OR 1=1 --" AND Pass ="doesn't matter"

这有效地删除了剩余的SQL,因为编译器将其视为注释。

答案 1 :(得分:1)

空字符串等于空字符串,不是吗?

答案 2 :(得分:1)

""=""将空字符串与另一个空字符串进行比较,结果为true,就像比较'1'='1''FooBar'='FooBar'一样。

答案 3 :(得分:0)

'' = ''是正确的,原因与1 = 1为真。您可以将字符串与SQL中的字符串进行比较。

这样想:比较两个名字,比如:'ihor' = 'ihor'他们自然是平等的,对吧?现在只是假装这个名字是......空的:)那就是它。空字符串本身就是一个值,因此可以将它与另一个空字符串进行比较。

与空字符串(值为)相比,NULL缺少值。由于您无法比较缺勤情况,因此NULL = NULLNULL <> NULL在SQL中均为假。