很抱歉,如果这看起来像一个愚蠢的问题,但我正在阅读有关SQL注入和所提到的这种状态之一的SQL命令,如
SELECT *
FROM Users
WHERE Name ="" or ""=""
AND Pass ="" or ""=""
将有效并返回表用户的所有记录。我理解做
之类的事情背后的逻辑SELECT *
FROM Users
WHERE UserId = 105 or 1=1
但我似乎无法弄清楚为什么""=""
会成为真实的陈述。我对SQL很新,我已经搜索了一个答案,但大多数SQL注入的例子只提到了1 = 1的例子。
答案 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 = NULL
和NULL <> NULL
在SQL中均为假。