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