我为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,并且所有值都是数字。
答案 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" ;
因此你的第二个条件总是如此。