如何避免 ASP.NET 应用程序中的 SQL 注入攻击?
-
08-07-2019 - |
题
我需要避免在 ASP.NET 应用程序中容易受到 SQL 注入的攻击。我怎样才能做到这一点?
解决方案
尽管您的问题非常笼统,但始终适用一些规则:
- 使用参数化查询(
SqlCommand
和SqlParameter
)并将用户输入放入参数中。 - 不要根据未经检查的用户输入构建 SQL 字符串。
- 不要假设您可以构建一个清理例程来检查用户输入是否存在各种格式错误。边缘情况很容易被遗忘。检查数字输入可能很简单,足以让您安全起见,但对于字符串输入,只需使用参数即可。
- 检查二级漏洞 - 如果 SQL 表值由用户输入组成,则不要从 SQL 表值构建 SQL 查询字符串。
- 使用存储过程来封装数据库操作。
其他提示
使用准备好的陈述(链接到在“为产品添加节点”部分中使用预准备语句的ASP.NET教程。这里的所有都是它的。
好吧,那个或者使用ORM,比如 Linq to SQL 或 NHibernate ,他们在内部使用准备好的陈述。
使用参数!它真的很简单: - )
像这样创建你的查询(对于带有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注入。
由于这很简单,所以没有理由不使用参数。
绝不信任用户输入 - 使用验证控件,正则表达式,代码等验证所有文本框条目
从不使用动态SQL - 使用参数化SQL或存储过程
永远不要使用管理员级帐户连接到数据库 - 使用受限访问帐户连接到数据库
不以纯文本格式存储机密 - 加密或散列密码及其他敏感数据;你还应该加密连接字符串
例外情况应泄漏最少的信息 - 不要在错误消息中泄露太多信息;使用customErrors在出现未处理错误时显示最少的信息;将debug设置为false
MSDN上的有用链接停止SQL注入
发生SQL注入是因为正在实时构建对数据库的查询,例如:
SELECT * From Table1 WHERE " + UserInput
UserInput
可能是恶意的,并包含您不想要的其他语句。
为避免这种情况,您需要避免将查询连接在一起。
您可以使用参数化查询来完成此操作 - 查看DBCommand
对象以了解您的特定数据库风格。
使用参数化查询和/或存储过程,并通过SQL参数解析参数。 从不通过连接字符串生成SQL代码。还要做一些关于SQL注入和编写安全代码的阅读,因为防止SQL注入只是安全性的一小部分。还有更多(如XSS - Cross Site Scripting)。如果黑客想要破坏您的网站/应用程序,他将寻找更多,只有SQL注入。
Scott Guthrie 发表了一篇不错的文章。在其中,他提出了5条保护自己的建议:
如果不使用类型安全的参数编码机制,请不要构造动态SQL语句。 [...]
在将应用程序投入生产之前,请始终对其进行安全审核,并建立正式的安全流程,以便在您进行更新时随时查看所有代码。 [... ]
切勿将敏感数据以明文形式存储在数据库中。 [...]
确保编写自动化单元测试,专门针对SQL注入攻击验证数据访问层和应用程序。 [...]
- 醇>
锁定您的数据库,只授予访问它的Web应用程序所需的最小权限集。 [...]
他在解释为什么这些很重要时做得不错,并且还链接到其他几个资源......
永远不要信任用户输入,始终对其进行验证,并使用sql参数。应该足以防止SQL注入。
希望这会有所帮助:
简短的回答是使用参数化查询。
安东尼:-) www.codersbarn.com
始终只使用参数化查询。
正如其他人所说,不要连接用户输入来创建动态sql语句;在使用动态SQL时始终使用参数化SQL。但是我会指出,在存储过程中创建动态sql时,此规则也适用。这个事实是人们经常忽视的。他们认为它们是安全的,因为它们<!>使用存储过程。<!>
本书,<!>“构建安全的ASP.NET应用程序<!>”;指南中有关于此主题的部分。
使用XSS Secured UrlEncode使用Microsoft.Security.Application.AntiXss.UrlEncode和SQL注入将无法正常工作。或者您可以使用ASP.NET <!>#8211; JSON <!>#8211;序列化和反序列化
还可以使用Macfee Fre Tool中的SiteDigger测试您的应用程序。
少数来自此处
.NET Security Toolkit v1.0 .NETMon v1.0 Validator.NET v1.0
每个人都说<!>“;使用参数<!>”;如果不是那么反常的话,我们不得不说它少了。
使用 QueryFirst 。连接的诱惑被删除,正确的方式成为最简单的方法。只需在SQL中键入@myParam即可创建一个参数,该工具将完成其余工作。
免责声明:我写过QueryFirst
了解SQL注入的确切内容,然后永远不要编写任何易受其攻击的内容。
尝试使用存储过程,并验证数据输入。不要像INSERT INTO那样使用任何直接的SQL ......