【问题标题】:What SqlCommand.Parameters.AddWithValue really does?SqlCommand.Parameters.AddWithValue 真的是做什么的?
【发布时间】:2010-07-14 03:19:37
【问题描述】:

SqlCommand.Parameters.AddWithValue() 对查询有什么变化?

我希望:

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

  2. 1234563李>
  3. 如果参数值是整数之类的“安全”值,它会按原样插入查询中,不带引号,因此select * from A where B = @one 将给出select * from A where B = 1

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

【问题讨论】:

    标签: .net tsql sql-injection sqlcommand escaping


    【解决方案1】:

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

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

    从未进行过替换,在客户端没有“将完整的 SQL 语句串在一起”——没有类似的东西。如果这就是 ADO.NET 运行时所做的事情,那么它也很容易受到 SQL 注入攻击。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 使用 SQL Profiler 代替反射器。它速度更快,您将确切地看到 sql server 中发生了什么。
      • @Chris:这当然会给你最终产品(生成的 SQL 语句),但它不会描述组装该产品的算法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      相关资源
      最近更新 更多