回答你的直接问题:此代码是否可以防止 SQL 注入:否
这是证明 - 通过PrepareString方法推送这个字符串:
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
我修改了您发布的 GetRecord 方法,以返回完全准备好的 SQL 字符串,而不是从数据库获取记录:
Console.WriteLine(GetRecord(output))
这是输出
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
添加 1 行额外代码:
My.Computer.Clipboard.SetText(input)
您已经将需要复制到剪贴板的字符串粘贴到网站上的输入字段中以完成 SQL 注入:
'; Drop Table TableName; - -
[请注意,StackOverflow 的帖子输出中省略了控制字符,因此您必须按照代码示例来创建输出]
运行PrepareString方法后,它将具有完全相同的输出 - Chr(8) ASCII代码是退格键,它将删除您附加到我的多余的“'”,这将关闭您的字符串,然后我可以自由地在最后添加我想要的任何内容。您的PrepareString看不到我的--因为我实际上使用--和退格字符来删除空格。
您正在构建的 SQL 代码将不受阻碍地执行我的 Drop Table 语句,并立即忽略查询的其余部分。
有趣的是,您可以使用不可打印的字符来基本上绕过您可以发明的任何字符检查。因此,使用参数化查询是最安全的(这不是您所要求的,但却是避免这种情况的最佳途径)。