SqlCommand.Parameters.AddWithValue()
对查询做了哪些更改?
我希望:
它会将每个'
字符替换为''
,
如果参数值是一个字符串或必须转换为字符串的内容,它会将值围绕'
,因此例如select * from A where B = @hello
会给select * from A where B = 'hello world'
。
如果参数值像整数一样“安全”,它会按原样插入查询中,不带引号,因此select * from A where B = @one
会给select * from A where B = 1
。
还有其他我不知道的变化吗?
答案 0 :(得分:7)
ADO.NET SqlClient驱动程序将不进行任何替换!这是一种常见的误解 - 它避免了更换任何东西的麻烦。
它的作用是将带有参数@param1 ... @paramN
的查询直接传递给SQL Server,以及一组参数名称/值对。然后SQL Server使用sp_executesql
存储过程执行那些。
没有进行任何替换,在客户端没有“将完整的SQL语句串在一起” - 没有类似的东西。如果这就是ADO.NET运行时正在做的事情,那么它也会受到SQL注入攻击的影响。
答案 1 :(得分:0)
简短的回答是,使用它会在SqlParameterCollection的末尾添加一个值,同时使参数值不受SQL注入的影响。
MSDN文档没有记录方法的确切内部行为,我怀疑它是否符合您的描述。但是,如果您愿意,可以使用Reflector查看方法的源代码,并确切了解它的作用。