SQL 基于“”=”的注入

SQL Injection Based on ""=""

我是 SQL 的新手,所以请耐心等待(尽管我承认这可能只是我应该已经掌握的编程概念)...

有关可能的 SQL 注入向量的阅读表明,一种潜在的攻击模式是将用户名或密码字段设置为 "or ""="

一个示例用例是:

uName = getRequestString("UserName");
uPass = getRequestString("UserPass");

sql = "SELECT * FROM Users WHERE Name ='" + uName + "' AND Pass ='" + uPass + "'"

导致以下 SQL 代码行:

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

他们给出的推理是 WHERE ""="" 的计算结果总是为真。为什么会这样?我了解 or 1 = 1 如何计算为真,但此代码如何计算为真?

非常感谢您的帮助!

编辑: 我认为我最初的困惑源于将双引号读作转义符,而不是空字符串。这应该是显而易见的,所以谢谢!

忽略您不需要在该查询中注入这种特殊边缘情况的事实...

The reasoning they gave is that WHERE ''='' always evaluates to true. How and why is this so?

'' 只是一个空字符串常量。所以,从逻辑上讲,'' 等于 ''。这就像说 1=1,因为常数总是等于它自己。

写出:

SELECT 
    * 
FROM 
    Users 
WHERE 
    (Name = '' OR '' = '') 
    AND 
    (Pass = '' OR '' = '')

因为它是一个 OR 语句,每个条件中只有一个条件必须为真,但它必须在两个子句中都为真。

您必须始终检查变量是否包含在 SQL 语句中,或者如您所说,将导致崩溃:

if(!string.IsNullOrEmpty(uName) && !string.IsNullOrEmpty(uPass))
{ 
   // SQL STATMENT 
}
else 
{ 
   // ERROR ONE IS EMPTY 
}

最好将这些变量绑定到参数以避免注入,请在此处查看我的回答以了解如何做到这一点:

null value exception when entering into database