当操作符OR操作的两个操作数都为False时,为什么此SQL代码返回true?

时间:2014-01-23 20:21:19

标签: sql sql-server

我为Table'Orders'运行以下SQL,如下所示:

SELECT * FROM Orders WHERE EmployeeID = 99 OR "TEST" ;
OrderID CustomerID EmployeeID OrderDate ShipperID 
10248     90          5       7/4/1996    3  
10249     81          6       7/5/1996    1  

我正在研究和理解SQL注入,因此我之前尝试了以下内容,正如预期的那样返回TRUE并因此显示完整的表'Orders',但在上面的情况下运行时它仍显示完整的表,为什么?即使最终结果为FALSE,如同   EmployeeID = 99或“TEST” “EmployeeID”列中没有值等于99,并且所有值都是数字。

7 个答案:

答案 0 :(得分:2)

因为“TEST”的布尔值始终为true。你需要尝试这样的事情:

SELECT * FROM Orders WHERE EmployeeID = 99 OR EmployeeID =  'TEST' ;

答案 1 :(得分:2)

这是因为“TEST”总是如此。

记住:

false OR false => false
false OR true => true
true OR false => true
true OR true => true

在您的情况下,EmployeeID = 99是否为真无关紧要......

顺便说一句:这就是注射的工作原理。

答案 2 :(得分:1)

尝试:

SELECT <fill in column list here, never use select * in production code> FROM Orders WHERE (EmployeeID = 99 OR  EmployeeID = "TEST" );

答案 3 :(得分:1)

如果没有EmployeeId=99,您想要所有记录吗?然后你只需要使用NOT EXISTS

SELECT * 
FROM Orders 
WHERE NOT EXISTS(SELECT 1 FROM Orders o1 WHERE o1.EmployeeID = 99)
OR EmployeeID = 99 

您不必担心这个简单的子查询在SQL-Server中执行多次。

答案 4 :(得分:0)

我猜你的意思是

SELECT * FROM Orders WHERE (EmployeeID = 99) OR (EmployeeID = "TEST");

答案 5 :(得分:0)

...试

WHERE (EmployeeID = 99 OR EmployeeID = "TEST")

结果将出现在OR中,因为它只需要其中一个是真的。对于AND的情况,两者必须同时为真!

这个测试很奇怪,因为“TEST”是字符串,而EmployeeID是数字。

答案 6 :(得分:0)

仍然没有接受的答案,所以我要解释每个人都在说什么。 您的查询实际上解释为:

SELECT * FROM Orders WHERE EmployeeID = 99 OR "TEST" = "TEST" ;

因此你的第二个条件总是如此。