最佳做法是什么?我正在创建一个ASP.NET
站点,用户可以在其中输入要存储在SQL数据库中的文本数据。我使用HttpUtility.HTNLEncode()
来存储数据,使用HTMLDecode
来显示数据。
这很有效,但它确实搜索(选择或自由文本)更加困难。用户应该能够输入包含<,“,'和任何其他有问题的字符的文本。
最佳做法是什么?存储未编码的数据?如何降低注射风险呢?
答案 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。
请记住,始终清理您的输入!