[英]How can I avoid SQL injection attacks in my ASP.NET application?
我需要避免在ASP.NET应用程序中容易受到SQL注入的攻击。 我该怎么做?
即使您的问题很笼统,也始终遵循一些规则:
SqlParameter
SqlCommand
)并将用户输入放入参数中。 使用准备好的语句(链接到使用“为产品添加节点”部分中使用准备好的语句的ASP.NET教程)。 这里的所有都是它的。
好吧,或者使用ORM,例如Linq to SQL或NHibernate ,它们在内部使用准备好的语句。
使用参数! 真的就是这么简单:-)
像这样创建查询(对于使用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条保护自己的建议:
在不使用类型安全的参数编码机制的情况下,请勿构造动态SQL语句。 [...]
在将应用程序投入生产之前,请始终对其进行安全检查,并建立正式的安全流程以在进行更新时随时检查所有代码。 [...]
切勿将敏感数据以明文形式存储在数据库中。 [...]
确保编写自动化单元测试,以专门验证您的数据访问层和应用程序是否受到SQL Injection攻击。 [...]
锁定数据库以仅授予访问该数据库的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.