3

我们如何处理 asp.net mvc (C#) 应用程序中的 javascript 注入?

我可以在我的视图中使用 Html.Encode。但问题是我有 html 也可以像博客文章一样显示在页面中。

我需要删除在应用程序的输入元素中输入的脚本吗?我怎么能在一个共同的地方做到这一点?

4

1 回答 1

9

这样做的“高级”最佳实践是:

  • 以输入系统的方式存储用户输入
  • 当在任何页面上输出时,HTML 对所有用户输入进行编码
  • 使用白名单方法“解编码”您在上一步中编码的允许的 HTML 字符、属性、属性值等

输出上的 HTML 编码用户输入将阻止 JavaScript 在您的站点上执行。

您希望“按输入”存储用户输入的原因是因为您将来可能决定以其他格式(PDF、电子邮件、JavaScript、RSS 等)输出用户数据,这些格式没有相同的编码规则. 因此,您应该使数据尽可能接近其原始形式。这将使以后的事情更容易处理。

对于 HTML 编码用户输入,您可以使用System.Web.HttpUtility.HtmlEncode(...).

要结合步骤 2 和 3,您可以使用 Microsoft 的AntiXSS 库。它提供了一些 HttpUtility 类没有提供的额外编码方法,以使您的工作更轻松。直到 Malcolm 在评论中指出,我才知道这个库的最新版本包含一个名为的方法,该方法GetSafeHtmlFragment(...)将手动删除所有 JavaScript。这将为您处理删除用户输入的 JavaScript 代码的所有繁重工作。您很可能希望使用 GetSafeHtmlFragmentand not GetSafeHtml,它旨在对整个 HTML 文档进行编码。

小提示:如果您发现功能未按预期工作,请阅读最新 AntiXss 版本(撰写本文时为 2012 年 1 月)的评论。您可能需要根据需要考虑使用旧版本,但请注意旧版本中存在已知的安全缺陷。微软已经承认了这个问题并正在寻找解决方案。

于 2010-02-06T06:10:09.060 回答