【问题标题】:How does SqlCommand sanitize parameters?SqlCommand 如何清理参数?
【发布时间】:2009-05-29 14:02:30
【问题描述】:

使用SqlParameters 是防止数据库查询中的SQL 注入的推荐方法。我在哪里可以找到内部清理这些参数的代码/函数?我想在我的自定义实现中重用这个函数。我尝试使用 Reflector 找到它,但没有成功。

【问题讨论】:

  • 好问题 - 了解使用参数化查询提供的安全性有多深非常重要。

标签: .net sqlparameter


【解决方案1】:

它可以防止 SQL 注入,而不是 XSS,并且没有代码或函数可以清理参数数据。

保护是通过将参数值与查询字符串分开传输到服务器来实现的,因此这些值从不直接替换到sql语句中。

所以不是 sql server 运行这样的东西:

SELECT * FROM [table] WHERE [column] = ParameterValue

它更像是这样运行的:

DECLARE @ParamValue int
  -- //@ParamValue variable is populated from the framework in a safe way
SELECT * FROM [table] WHERE [column] = @ParamValue

这比必须评估参数数据的函数更快、更安全、更健壮。这样的函数需要非常复杂(阅读:容易出错)才能处理custom escape characters 和未来的增强功能。

这巧妙地绕过了整个问题:数据就是数据,代码就是代码,两者永远不会相遇。


你对对方的评论,现已删除,回答:

如果我传入值 O'Rourke,它会将其编码为 O''Rourke,这样它就不会破坏查询。正确的?

不,这是不正确的。该变量是直接从数据块创建的,因此不需要特殊的转义或编码。

【讨论】:

  • 好的,有道理,谢谢。 “//@ParamValue 变量以安全的方式从框架中填充”那么如何以安全的方式填充?
  • 这不是sql - 该变量是由sql server从客户端传输的data块创建的,但它保存在数据段中,从不被视为代码,所以数据不需要转义或编码。
  • 您知道有关这方面的任何详细文献吗?我真的很想了解整个过程。
  • 这几乎涵盖了它的“什么”和“为什么”。 “如何”通常被称为“实施细节”,这意味着他们保留更改该部分的权利,并且可能不会在任何地方发布。如果它出版,你最好的选择是在线书籍:msdn.microsoft.com/en-us/library/ms130214.aspx
  • 自从我最初写这个答案以来我学到的东西是参数化查询通过调用 sp_executesql。阅读它以了解更多关于正在发生的事情:msdn.microsoft.com/en-us/library/ms188001.aspx
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多