在 asp.net mvc 中处理 javascript 注入

Posted

技术标签:

【中文标题】在 asp.net mvc 中处理 javascript 注入【英文标题】:handle javascript injection in asp.net mvc 【发布时间】:2011-01-13 19:25:45 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

执行此操作的“高级”最佳实践是:

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

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

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

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

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

小提示:如果您发现功能未按预期工作,请阅读最新 AntiXss 版本(撰写本文时为 2012 年 1 月)的评论。您可能需要根据需要考虑使用旧版本,但请注意旧版本中存在已知的安全缺陷。 Microsoft has acknowledged the issue and is looking into a solution.

【讨论】:

我有一段时间没有听说过 Anixss libray,也不知道它现在在 codeplex 上。它有 Javascript 编码。我的理解是,如果要在 javascript 中使用输入,则需要进行 Javascript 编码。 HttpUtility 没有 Javascript 编码。所以每个项目都需要有这个库对吗? @Malcolm 每个计划对用户输入进行编码以便在 JavaScript 中使用的项目都应该有这个库。 这是新的并且看起来非常有用:AntiXss.GetSafeHtml(input)。该方法有自己的 html 标签白名单。完美! 在这篇文章中添加了警告说明,我正要开始使用 AntiXSS,但幸运的是之前确实阅读了评论消息。根据最新版本的 AntiXSS 中出现的一些问题的评论,这个答案非常好和可靠。 @Kallex 在此处添加此注释作为评论是合适的,而不是编辑答案。

以上是关于在 asp.net mvc 中处理 javascript 注入的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 中处理“OPTIONS 方法”

asp.net mvc全局错误处理

Asp.net MVC 之异常处理

在 asp.net mvc 中处理 javascript 注入

如何在 ASP.NET MVC 中使用通用处理程序 (ASHX)?

处理用户在 ASP.NET MVC 网站中点击“Enter”键