繁体   English   中英

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

[英]How can I avoid SQL injection attacks in my ASP.NET application?

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

即使您的问题很笼统,也始终遵循一些规则:

  • 使用参数化查询(带有SqlParameter SqlCommand )并将用户输入放入参数中。
  • 不要从未经检查的用户输入中构建SQL字符串。
  • 不要以为您可以构建一个清理例程,该例程可以检查用户输入的各种格式错误。 边缘盒很容易被遗忘。 检查数字输入可能很简单,可以使您安全起见,但是对于字符串输入,只需使用参数即可。
  • 检查第二级漏洞-如果这些值由用户输入组成,则不要从SQL表值中构建SQL查询字符串。
  • 使用存储过程来封装数据库操作。

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

好吧,或者使用ORM,例如Linq to SQLNHibernate ,它们在内部使用准备好的语句。

使用参数! 真的就是这么简单:-)

像这样创建查询(对于使用C#的MS Sql服务器):

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

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

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

在这里,theName是一个变量,其中包含您要搜索的名称。

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

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

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

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

切勿使用管理员级别的帐户连接到数据库 -使用受限访问帐户连接到数据库

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

异常应该泄露最少的信息 -不要在错误消息中透露太多信息; 如果发生未处理的错误,请使用customErrors显示最少的信息; 将debug设置为false

MSDN上的有用链接停止SQL注入

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

SELECT * From Table1 WHERE " + UserInput

UserInput可能是恶意的,并且包含您不想要的其他语句。

为了避免这种情况,您需要避免将查询串联在一起。

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

斯科特·古思里(Scott Guthrie)不久前发表了一篇有关此事的不错的小文章 在其中,他提供了5条保护自己的建议:

  1. 在不使用类型安全的参数编码机制的情况下,请勿构造动态SQL语句。 [...]

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

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

  4. 确保编写自动化单元测试,以专门验证您的数据访问层和应用程序是否受到SQL Injection攻击。 [...]

  5. 锁定数据库以仅授予访问该数据库的Web应用程序正常运行所需的最小权限集。 [...]

他做了出色的工作来解释为什么这些很重要,并且还链接到其他一些资源...

使用参数化查询和/或存储过程,并通过SQL参数解析参数。 切勿通过串联字符串来生成SQL代码。 还请阅读一些有关SQL注入和编写安全代码的内容,因为防止SQL注入只是安全性的一小部分。 还有更多(例如XSS-跨站点脚本)。 如果黑客想要破坏您的站点/应用程序,那么他将寻找更多的内容,而不仅仅是SQL注入。

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

始终仅使用参数化查询。

希望这会有所帮助:

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

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

安东尼:-) www.codersbarn.com

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

《构建安全的ASP.NET应用程序》指南这本书中有关于此主题的部分

通过Microsoft.Security.Application.AntiXss.UrlEncode使用XSS安全的UrlEncode和SQL注入将不起作用。 或者,您可以使用ASP.NET – JSON –序列化和反序列化

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

还有更多来自这里

.NET安全工具包v1.0 .NETMon v1.0验证程序.NET v1.0

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

使用QueryFirst 消除连接的诱惑,正确的方法成为最简单的方法。 您只需在SQL中键入@myParam即可创建参数,其余部分由该工具完成。

免责声明:我写了QueryFirst

了解什么是SQL注入,然后再写任何易受其影响的东西。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM