4

最佳做法是什么?我正在制作一个ASP.NET网站,用户可以在其中输入要存储在 SQL 数据库中的文本数据。我HttpUtility.HTNLEncode()用来存储数据并HTMLDecode显示它。

这很好用,但它确实搜索(选择或自由文本)要困难得多。用户应该能够输入包含 <、"、' 和任何其他有问题的字符的文本。

最佳做法是什么?存储未编码的数据?那我该如何降低注射的风险呢?

4

4 回答 4

4

始终将用户输入未编码地存储在数据库中,并始终在输出之前对来自数据库的用户输入进行编码。

您还应该在持久化之前过滤/验证用户输入。

  • 输入:用户输入 -> 验证/过滤 -> 保存到数据库
  • 输出:来自数据库的内容 -> 编码 -> 输出到客户端

这是使用和重用用户数据的唯一合理方法。

另请参阅http://msdn.microsoft.com/en-us/library/t4ahd590%28v=vs.80%29.aspx#cpconbestsecuritypracticesforwebapplicationsanchor4 以及HTML 在被持久化之前应该被编码吗?

于 2012-09-05T11:57:06.377 回答
2

这里有几个方面要介绍,所以我会尽力涵盖这些要点。要点是:

  • 提交可能不安全的文本
  • 存储不安全的文本
  • 显示不安全的文本

ASP.NET 有一个验证机制(正如@Candie 所指出的)作为抵御攻击的第一道防线。如果您有一个需要提交 HTML、XML、JS 等的应用程序,您必须覆盖验证以允许它通过。

一旦数据通过,我会说存储是安全的。存储这些数据的最佳方式是使用存储过程,而不是动态 T-SQL,因为它可能导致SQL 注入攻击

现在剩下的唯一问题来自在 HTML 中逐字显示该数据。如果您从字面上将内容转储到屏幕上,那么您的问题可能会开始变得更加明显。所以这就是你HTMLEncode发挥作用的地方。字符被转换为 HTML 等效代码,以免造成危险。Literal 控件提供了一个.Mode属性,因此该控件可以为您处理此问题。

最后,MSDN 上有一篇关于How to: Protect against Script Exploits in a Web Application by Applying HTML Encoding to Strings的文章,也可能有用。

于 2012-09-05T12:16:03.530 回答
0

您在页面 aspx 中调整 ValidateRequestMode

ValidateRequestMode="ValidateRequestMode.Disabled"

链接:http: //msdn.microsoft.com/en-us/library/system.web.ui.page.validaterequestmode.aspx

于 2012-09-05T11:58:48.777 回答
0

您需要问自己的问题是,为什么要对数据进行编码?

如果您试图避免 SQL 注入,那么您应该在将数据放入数据库之前对其进行验证。例如,如果您只想在输入中使用字母数字字符,那么您将在将其插入数据库之前对其进行检查。

如果他们正在输入 HTML,这使得检查文本变得更加困难,那么我建议使用存储过程。

如果您使用的是 MsSQL,那么这可能会有所帮助。.

如果您使用的是 MySQL,那么我认为 这可能是指它们

请记住,始终清理您的输入!

于 2012-09-05T12:29:50.607 回答