【问题标题】:Gracefully handling HTML tags on form submission in asp.net MVC 2在 asp.net MVC 2 中优雅地处理表单提交时的 HTML 标记
【发布时间】:2010-09-23 16:01:43
【问题描述】:

您好,我有一个 MVC 站点,将让用户输入要在网页上显示的文本。 我试图想出一种优雅的方式来处理用户尝试输入的任何 HTML - 因为您可能会知道 MVC 2 会为文本中的任何 HTML 引发错误。

我使用 ViewModels 并使用 DataAnotation 类中的过滤器装饰我的属性以验证我的表单。

现在有人这样吗?

是否有一些疯狂的正则表达式不匹配 HTML 但其他任何东西或其他方式?

我愿意接受任何建议。

谢谢,

西蒙

【问题讨论】:

    标签: c# jquery asp.net-mvc regex asp.net-mvc-2


    【解决方案1】:

    添加以下属性将停止运行时抱怨:

    [ValidateInput(false)]
    public ActionResult SomeEvilAction ()
    {
        /* ... */
    }
    

    现在您的任务是对页面上显示的每个输入进行 HTML 编码:

    <%= HttpUtility.HtmlEncode (Model.Text) %>
    

    <%: Model.Text %>
    

    【讨论】:

    • 谢谢 - 我正在寻找更优雅的东西,它会提示用户不允许使用 HTML。我想保留文本框中的回车,所以我编写了一个 HTML 帮助程序来将它们转换为
      并删除潜在的恶意脚本标签。请记住,即使要在页面附近获取脚本标签 - 他们也必须通过 MVC 的恶意输入检查。因此,对于这一实例,我的文本没有被编码,要在页面上运行 html,他们需要直接访问数据库!
    • 对页面上显示的每一段文本进行 HTML 编码始终是您的任务。 ASP.NET 的反 XSS 过滤无法充分保护您。 最好的情况是它只会掩盖真正的问题,最坏的情况是它会给您原本安全的应用程序添加有趣的新错误。我永远不会将它用于任何事情,而且我对微软感到非常失望,他们似乎认为这种错误的方法在任何方面都是有效的。
    【解决方案2】:

    我在前几天做的一个网站上做了同样的事情。

    我正在使用一个所见即所得的编辑器,它可以放入正确的 html,而不是 bb 代码。

    我从页面指令中禁用了页面上的验证,以阻止 mvc 抛出潜在的不安全代码异常,并使用正则表达式删除了所有脚本标记实例。

    查看 Developer Art 的帖子

    您可能需要将此添加到您的 web.config 中

    <httpRuntime requestValidationMode="2.0" />
    

    我使用的正则表达式如下:

    (?<startTag><\s*script[^>]*>)(?<scriptContent>[\s\S]*?)(?<endTag><\s*/script>)
    

    这将为您提供 3 个命名组。 开始标签 脚本内容 结束标签

    因此您可以对脚本元素进行替换并显示脚本的内容,或者将其完全删除。

    你真正想做的任何事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 2010-10-10
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多