我意识到参数化 SQL 查询是在构建包含用户输入的查询时清理用户输入的最佳方式,但我想知道接受用户输入并转义任何单引号并用单引号包围整个字符串有什么问题。这是代码:
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
用户输入的任何单引号都将替换为双单引号,这消除了用户结束字符串的能力,因此他们可能键入的任何其他内容,例如分号、百分号等,都将成为字符串的一部分,并且实际上并未作为命令的一部分执行。
我们使用的是 Microsoft SQL Server 2000,我相信单引号是唯一的字符串定界符,也是转义字符串定界符的唯一方法,因此无法执行用户输入的任何内容。
我看不出有任何方法可以对此发起 SQL 注入攻击,但我意识到,如果这在我看来是防弹的,那么其他人早就想到了,这将是常见的做法。
这段代码有什么问题?有没有办法通过这种清理技术进行 SQL 注入攻击?利用此技术的示例用户输入将非常有帮助。
更新:
我仍然不知道有什么方法可以有效地对这段代码发起 SQL 注入攻击。一些人建议反斜杠将转义一个单引号并留下另一个以结束字符串,以便将字符串的其余部分作为 SQL 命令的一部分执行,我意识到这种方法可以将 SQL 注入MySQL 数据库,但在 SQL Server 2000 中,唯一的方法(我已经能够找到)转义单引号是使用另一个单引号;反斜杠不会这样做。
除非有办法阻止单引号的转义,否则用户输入的其余部分都不会被执行,因为它们都将被视为一个连续的字符串。
我知道有更好的方法来清理输入,但我真的更有兴趣了解为什么我上面提供的方法不起作用。如果有人知道针对这种清理方法发起 SQL 注入攻击的任何特定方法,我很乐意看到它。