最佳做法是什么?我正在制作一个ASP.NET
网站,用户可以在其中输入要存储在 SQL 数据库中的文本数据。我HttpUtility.HTNLEncode()
用来存储数据并HTMLDecode
显示它。
这很好用,但它确实搜索(选择或自由文本)要困难得多。用户应该能够输入包含 <、"、' 和任何其他有问题的字符的文本。
最佳做法是什么?存储未编码的数据?那我该如何降低注射的风险呢?
始终将用户输入未编码地存储在数据库中,并始终在输出之前对来自数据库的用户输入进行编码。
您还应该在持久化之前过滤/验证用户输入。
这是使用和重用用户数据的唯一合理方法。
另请参阅http://msdn.microsoft.com/en-us/library/t4ahd590%28v=vs.80%29.aspx#cpconbestsecuritypracticesforwebapplicationsanchor4 以及HTML 在被持久化之前应该被编码吗?
这里有几个方面要介绍,所以我会尽力涵盖这些要点。要点是:
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的文章,也可能有用。
您在页面 aspx 中调整 ValidateRequestMode
ValidateRequestMode="ValidateRequestMode.Disabled"
链接:http: //msdn.microsoft.com/en-us/library/system.web.ui.page.validaterequestmode.aspx