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