如何通过用户输入破坏/利用此SQL查询代码?

Jon*_*gel 8 sql database sql-injection database-agnostic

可能重复:
我可以通过使用单引号转义单引号和周围用户输入来防止SQL注入吗?

我们有一个遗留应用程序不使用位置参数进行查询,并且到处都有SQL.决定(在我开始之前)由于用户输入可以包含撇号,因此应该为这些撇号手动转义每个字符串输入.

这是必要的原始代码(不是由我编写的),翻译成C#以便于使用:

private string _Escape(string input)
{
    return input.Replace("'", "''");
}

private bool _IsValidLogin(string userName, string password)
{
    string sql =
        string.Format
        (
            @"SELECT COUNT(*) FROM UserAccounts
                WHERE UserName = '{0}' AND Password = '{1}'",
            _Escape(userName),
            _Escape(password)
        );
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这看起来似乎可以在某种程度上被打破,但我不知道它是如何被用户输入利用的.假设用户输入未经过滤直到它命中_IsValidLogin,并忘记密码似乎以纯文本形式存储.

支持它的解决方案是显而易见的 - 使用位置参数 - 但是我需要一些弹药来向管理人员证明这个代码为什么/如何不安全所以可以分配时间/ $来修复它.

注意:我假设这可能会被打破,但实际情况可能并非如此.我不是SQL巨星.

注2:我已将此问题表达为与数据库无关,但如果您可以将此代码用于某个引擎,我欢迎您的贡献.

ere*_*non 3

它可以通过反斜杠来利用。

password = foo\' OR 1=1 --
Run Code Online (Sandbox Code Playgroud)

变成:

password = foo\'' OR 1=1 --
Run Code Online (Sandbox Code Playgroud)

查询:

"SELECT COUNT(*) FROM UserAccounts
                WHERE UserName = '{0}' AND Password = 'foo\'' OR 1=1 --'"
Run Code Online (Sandbox Code Playgroud)

--本例中就是注释标记。

该解决方案假设程序仅过滤(重复)撇号。