3

你什么时候打电话Microsoft.Security.Application.AntiXss.HtmlEncode?您是在用户提交信息时执行此操作,还是在您显示信息时执行此操作?

像名字、姓氏、城市、州、邮编这样的基本信息怎么样?

4

4 回答 4

12

您在显示信息时执行此操作。保留输入的原件,将其转换为在网页上显示。假设您以其他方式显示它,例如将其导出到 Excel。在这种情况下,您需要导出保存的原件。

编码每一个字符串。

于 2008-11-14T02:40:43.620 回答
4

您应该只在可能的最后时刻对数据进行编码或转义,无论是直接将其放入数据库之前,还是将其显示在屏幕上。如果你编码得太快,你会冒着意外双重编码的风险(你经常会&在新手的网站上看到 - 包括我自己)。

如果您确实想更快地进行编码,请采取措施避免双重编码。Joel 写了一篇关于匈牙利表示法的良好用途的文章,其中他提倡使用前缀来确定变量中存储的内容。例如:“us”表示不安全字符串,“ss”表示安全字符串。

usFirstName = getUserInput('firstName')

ssFirstName = cleanString(usFirstName);

另请注意,信息的类型是什么(城市、邮政编码等)并不重要——不选中任何这些都是自找麻烦。

于 2008-11-14T02:39:25.853 回答
2

这取决于你的情况。在我工作的地方,多年来公司没有进行 HTML 编码,所以当我们开始这样做时,几乎不可能在系统中找到可以在页面上显示用户输入的每个位置。

相反,我们选择在输入进入系统的过程中对其进行清理,因为输入点比输出点少。我们在将数据输入数据库之前立即进行清理,虽然我们不使用 Microsoft 的 AntiXss 库,但我们使用一组自制方法,根据输入类型将 HTML 标记和字符的范围列入白名单。

如果您从头开始设计系统,或者您有一个足够小(或管理良好)的系统来编码输出,请遵循 Corey 的建议。这绝对是更好的方法。

于 2008-11-14T03:01:26.667 回答
1

编码不是数据的属性,它是传输机制的属性。因此,您应该在收到数据时取消编码,并在传输前对其进行适当编码。传输机制决定了需要什么样的编码。

无论您的传输机制是 HTML、HTTP、烟雾信号等,这个原则都适用。诀窍是知道如何手动执行编码类型,以及各种框架何时自动为您执行这些步骤。例如,ASP.NET 将对分配给 System.Web.UI.WebControls.Button 的 Text 的数据进行编码,但不会对分配给 System.Web.UI.WebControls.Literal 的 Text 的文本进行编码。jQuery 将对使用 .innerText() 设置的内容进行编码,但不会对使用 .innerHtml() 设置的内容进行编码。

于 2009-11-24T00:34:06.960 回答