SqlCommand.Parameters.AddWithValue真的有用吗?

时间:2010-07-14 03:19:37

标签: .net tsql sql-injection sqlcommand escaping

SqlCommand.Parameters.AddWithValue()对查询做了哪些更改?

我希望:

  1. 它会将每个'字符替换为''

  2. 如果参数值是一个字符串或必须转换为字符串的内容,它会将值围绕',因此例如select * from A where B = @hello会给select * from A where B = 'hello world'

  3. 如果参数值像整数一样“安全”,它会按原样插入查询中,不带引号,因此select * from A where B = @one会给select * from A where B = 1

    < / LI>

    还有其他我不知道的变化吗?

2 个答案:

答案 0 :(得分:7)

ADO.NET SqlClient驱动程序将进行任何替换!这是一种常见的误解 - 它避免了更换任何东西的麻烦。

它的作用是将带有参数@param1 ... @paramN的查询直接传递给SQL Server,以及一组参数名称/值对。然后SQL Server使用sp_executesql存储过程执行那些。

没有进行任何替换,在客户端没有“将完整的SQL语句串在一起” - 没有类似的东西。如果这就是ADO.NET运行时正在做的事情,那么它也会受到SQL注入攻击的影响。

答案 1 :(得分:0)

简短的回答是,使用它会在SqlParameterCollection的末尾添加一个值,同时使参数值不受SQL注入的影响。

MSDN文档没有记录方法的确切内部行为,我怀疑它是否符合您的描述。但是,如果您愿意,可以使用Reflector查看方法的源代码,并确切了解它的作用。