将数据存储到SQL,编码与否?

时间:2012-09-05 11:51:23

标签: c# asp.net sql

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

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

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

4 个答案:

答案 0 :(得分:3)

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

您还应该在保留之前过滤/验证用户输入。

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

这是使用和重用用户数据的唯一理智方式。

另见http://msdn.microsoft.com/en-us/library/t4ahd590%28v=vs.80%29.aspx#cpconbestsecuritypracticesforwebapplicationsanchor4 以及Should HTML be encoded before being persisted?

答案 1 :(得分:2)

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

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

ASP.NET有一种验证机制(正如@Candie所指出的)是防御攻击的第一道防线。如果你有一个需要提交HTML,XML,JS等的应用程序,你必须覆盖验证才能通过。

一旦数据通过,我会说存储是安全的。存储此数据的最佳方法是使用存储过程,而不是动态T-SQL,因为它可以导致SQL Injection attacks

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

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

答案 2 :(得分:0)

您在页面aspx中调整ValidateRequestMode

ValidateRequestMode="ValidateRequestMode.Disabled"

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

答案 3 :(得分:0)

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

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

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

如果您正在使用MsSQL,那么this may help.

如果您正在使用MySQL,那么我 this may refer to them

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