我需要避免在我的 ASP.NET 应用程序中容易受到 SQL 注入的影响。我怎么能做到这一点?
16 回答
即使您的问题非常笼统,但始终适用一些规则:
- 使用参数化查询(
SqlCommand
withSqlParameter
)并将用户输入放入参数中。 - 不要根据未经检查的用户输入构建 SQL 字符串。
- 不要假设您可以构建一个可以检查用户输入的各种格式错误的清理程序。边缘情况很容易被遗忘。检查数字输入可能很简单,可以保证您的安全,但对于字符串输入,只需使用参数。
- 检查二级漏洞 - 如果这些值包含用户输入,则不要从 SQL 表值构建 SQL 查询字符串。
- 使用存储过程来封装数据库操作。
使用准备好的语句(链接到在“为产品添加节点”部分中使用准备好的语句的 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 显示最少的信息;将调试设置为 false
MSDN 上的有用链接Stop SQL Injection
发生 SQL 注入是因为对数据库的查询是实时构建的,例如:
SELECT * From Table1 WHERE " + UserInput
UserInput
可能是恶意的并包含您不希望的其他陈述。
为避免这种情况,您需要避免将查询连接在一起。
您可以通过使用参数化查询来完成此操作 - 检查DBCommand
对象是否适合您的特定数据库风格。
Scott Guthrie 不久前发表了一篇关于这方面的不错的小文章。在其中,他提出了 5 条保护自己的建议:
不要在不使用类型安全参数编码机制的情况下构造动态 SQL 语句。 [...]
始终在将应用程序投入生产之前对其进行安全审查,并建立正式的安全流程以在您进行更新时审查所有代码。 [...]
切勿在数据库中以明文形式存储敏感数据。 [...]
确保您编写自动化单元测试,专门验证您的数据访问层和应用程序免受 SQL 注入攻击。 [...]
锁定您的数据库,只授予访问它的 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。但是我要指出,在存储过程中创建动态 sql 时,该规则也适用。这个事实是人们经常忽略的。他们认为他们是安全的,因为他们正在“使用存储过程”。
“构建安全的 ASP.NET 应用程序”指南这本书有一个关于这个主题的部分。
使用 Microsoft.Security.Application.AntiXss.UrlEncode 使用 XSS Secured UrlEncode 和 SQL 注入将不起作用。或者您可以使用 ASP.NET – JSON – 序列化和反序列化
还可以使用 Macfee Fre Tool 中的 SiteDigger 测试您的应用程序。
更多来自这里
.NET 安全工具包 v1.0 .NETMon v1.0 Validator.NET v1.0
每个人都说“使用参数”。如果不是那么困难,我们就不得不少说。
使用QueryFirst。连接的诱惑被消除,正确的方法成为最简单的方法。您只需在 SQL 中键入 @myParam 即可创建参数,其余的由该工具完成。
免责声明:我写了 QueryFirst
了解 SQL 注入到底是什么,然后永远不要编写任何易受其攻击的东西。
尝试使用存储过程,并验证数据的输入。不要使用任何直接的 SQL,例如 INSERT INTO ...