2010-07-27 46 views

回答

12

当您使用参数时,它们通常不会首先作为文本发送。他们可以使用数据库的本地有线协议。如果参数本身是一个文本参数,那么它通常会被封装在协议中,以便数据库知道它是一个参数而不是SQL。

虽然我想供应商可能只是将参数转换为完整的SQL语句,这将是一个可怕的做事方式。

所以基本上“是” - 参数化查询是从SQL注入攻击安全有效,只要你没有存储动态执行参数,作为SQL等程序

2

当您使用参数,NET的SQL客户端会将参数值发送到原始TDS流中的SQL服务器。

但是,这并不能保护您免受不良SQL影响。
如果你的SQL调用EXECUTE的字符串包含一个连接参数,那么你仍然是脆弱的。

0

就字符串值而言,是的 - .NET会将它们转义给您,您可以通过尝试在表中找到值 - “comment”来查看这些值,这会破坏连接的语句,但哪些工作正常用参数化查询。

正如乔恩所说,尽管像数字和日期这样的东西将会以他们的原生格式发送,这样更安全/更快。

+1

我不确定我会说他们真的被*转义*这样 - 他们很可能被封装在这样一种方式,以消除转义的要求。它更可能是“接下来的20个字节形成以UTF-8编码的字符串参数” - 如果该数据包含引号等,则无关紧要,因为它不会被视为SQL。 – 2010-07-27 15:33:57

+0

事实上 - “封装”是一种更加准确的说法,因为“解析”只是解析器具有不能使用的特殊字符时才执行的操作,在这种情况下不适用。 – SqlRyan 2010-07-27 15:39:40