如何在ASP.NET应用程序中避免SQL注入攻击?

时间:2008-11-20 11:49:07

标签: .net asp.net sql security sql-injection

我需要避免在ASP.NET应用程序中容易受到SQL注入攻击。我怎么能做到这一点?

16 个答案:

答案 0 :(得分:24)

即使您的问题非常通用,但仍然适用一些规则:

  • 使用参数化查询(SqlCommandSqlParameter)并将用户输入放入参数中。
  • 不要使用未经检查的用户输入构建SQL字符串。
  • 不要假设您可以构建一个可以检查用户输入是否存在各种畸形的清理程序。边缘情况很容易被遗忘。检查数字输入可能很简单,可以让您安全,但对于字符串输入,只需使用参数。
  • 检查二级漏洞 - 如果这些值包含用户输入,请不要使用SQL表值构建SQL查询字符串。
  • 使用存储过程封装数据库操作。

答案 1 :(得分:17)

使用Prepared Statements(链接到使用“为产品添加节点”部分中的预准备语句的ASP.NET教程)。这里的所有都是它的。

那么,或者使用ORM,如Linq to SQLNHibernate,他们在内部使用预备语句。

答案 2 :(得分:14)

使用参数!它真的很简单: - )

像这样创建你的查询(对于带有C#的MS Sql server):

SqlCommand getPersons = new SqlCommand("SELECT * FROM Table WHERE Name = @Name", conn); 

这里@Name是你想要避免sql注入的参数,conn是一个SqlConnection对象。 然后,要添加参数值,请执行以下操作:

getPersons.Parameters.AddWithValue("@Name", theName);

此处theName是一个包含您要搜索的名称的变量。

现在应该不可能对该查询进行任何sql注入。

由于这很简单,所以没有理由不使用参数。

答案 3 :(得分:12)

绝不信任用户输入 - 使用验证控件,正则表达式,代码等验证所有文本框条目

从不使用动态SQL - 使用参数化SQL或存储过程

永远不要使用管理员级帐户连接到数据库 - 使用受限访问帐户连接到数据库

不以纯文本格式存储机密 - 加密或散列密码及其他敏感数据;你还应该加密连接字符串

例外情况应泄漏最少的信息 - 不要在错误消息中泄露太多信息;使用customErrors在出现未处理错误时显示最少的信息;将debug设置为false

MSDN Stop SQL Injection

上的有用链接

答案 4 :(得分:5)

发生SQL注入是因为正在实时构建对数据库的查询,例如:

SELECT * From Table1 WHERE " + UserInput

UserInput可能是恶意的,并包含您不想要的其他声明。

为避免这种情况,您需要避免将查询连接在一起。

您可以使用参数化查询来完成此操作 - 查看特定数据库风格的DBCommand对象。

答案 5 :(得分:4)

斯科特格思里posted a decent little article关于这一段时间。在其中,他提出了5条保护自己的建议:

  
      
  1. 如果不使用类型安全的参数编码机制,请不要构造动态SQL语句。 [...]

  2.   
  3. 在将应用程序投入生产之前,请始终对其进行安全审核,并建立正式的安全流程,以便在您进行更新时随时查看所有代码。 [... ]

  4.   
  5. 切勿将敏感数据以明文形式存储在数据库中。 [...]

  6.   
  7. 确保编写自动化单元测试,专门针对SQL注入攻击验证数据访问层和应用程序。 [...]

    < / LI>   
  8. 锁定您的数据库,只授予访问它的Web应用程序所需的最小权限集。 [...]

  9.   

他在解释为什么这些很重要时做得不错,并且还链接到其他几个资源......

答案 6 :(得分:4)

使用参数化查询和/或存储过程,并通过SQL参数解析参数。 从不通过连接字符串生成SQL代码。还要做一些关于SQL注入和编写安全代码的阅读,因为防止SQL注入只是安全性的一小部分。还有更多(如XSS - Cross Site Scripting)。如果黑客想要破坏您的网站/应用程序,他将寻找更多,只有SQL注入。

答案 7 :(得分:3)

永远不要信任用户输入,始终对其进行验证,并使用sql参数。应该足以防止SQL注入。

答案 8 :(得分:2)

希望这会有所帮助:

http://www.codersbarn.com/post/2008/11/01/ASPNET-Data-Input-Validation.aspx

简短的回答是使用参数化查询。

安东尼:-) www.codersbarn.com

答案 9 :(得分:2)

始终只使用参数化查询。

答案 10 :(得分:1)

正如其他人所说,不要连接用户输入来创建动态sql语句;在使用动态SQL时始终使用参数化SQL。但是我会指出,在存储过程中创建动态sql时,此规则也适用。这个事实是人们经常忽视的。他们认为这些是安全的,因为他们“正在使用存储过程。”

答案 11 :(得分:0)

本书“构建安全的ASP.NET应用程序”指南在此主题上有section

答案 12 :(得分:0)

使用XSS Secured UrlEncode使用Microsoft.Security.Application.AntiXss.UrlEncode和SQL注入将无法正常工作。或者您可以使用ASP.NET - JSON - 序列化和反序列化

还可以使用Macfee Fre Tool中的SiteDigger测试您的应用程序。

少数来自here

.NET Security Toolkit v1.0 .NETMon v1.0 Validator.NET v1.0

答案 13 :(得分:0)

每个人都说“使用参数”。如果不是那么反常的话,我们不得不说它少了。

使用QueryFirst。连接的诱惑被删除,正确的方式成为最简单的方法。只需在SQL中键入@myParam即可创建一个参数,该工具将完成其余工作。

免责声明:我写过QueryFirst

答案 14 :(得分:-3)

了解SQL注入的确切内容,然后永远不要编写任何易受其攻击的内容。

答案 15 :(得分:-4)

尝试使用存储过程,并验证数据输入。不要像INSERT INTO那样使用任何直接的SQL ......