我需要避免在ASP.NET应用程序中容易受到SQL注入攻击。我怎么能做到这一点?
答案 0 :(得分:24)
即使您的问题非常通用,但仍然适用一些规则:
SqlCommand
和SqlParameter
)并将用户输入放入参数中。答案 1 :(得分:17)
使用Prepared Statements(链接到使用“为产品添加节点”部分中的预准备语句的ASP.NET教程)。这里的所有都是它的。
那么,或者使用ORM,如Linq to SQL或NHibernate,他们在内部使用预备语句。
答案 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)
如果不使用类型安全的参数编码机制,请不要构造动态SQL语句。 [...]
在将应用程序投入生产之前,请始终对其进行安全审核,并建立正式的安全流程,以便在您进行更新时随时查看所有代码。 [... ]
切勿将敏感数据以明文形式存储在数据库中。 [...]
确保编写自动化单元测试,专门针对SQL注入攻击验证数据访问层和应用程序。 [...]
< / LI>- 醇>
锁定您的数据库,只授予访问它的Web应用程序所需的最小权限集。 [...]
他在解释为什么这些很重要时做得不错,并且还链接到其他几个资源......
答案 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 ......