【问题标题】:ValidateInput(false) vs AllowHtmlValidateInput(false) 与 AllowHtml
【发布时间】:2014-10-27 02:48:47
【问题描述】:

我有一个用于创建备忘录的表单,为此我使用富文本编辑器提供一些样式,这会创建 html 标记以应用样式。当我发布该文本时,mvc 会引发错误以防止潜在的危险脚本,因此我必须明确允许它。

我找到了两种方法,一种是用[ValidateInput(false)]装饰控制器方法,另一种是用[AllowHtml]装饰ViewModel属性。对我来说,[AllowHtml] 看起来好多了,但我发现这种方法只使用了 1 次,而[ValidateInput(false)] 似乎是首选方式。

我应该使用哪种方法,两者有什么区别?

【问题讨论】:

    标签: asp.net-mvc-4 viewmodel richtext


    【解决方案1】:

    如果使用 Bind Include 最好的方法是 AllowHtml 否则 您可以使用 ValidateInput(false) 来禁用 controll 中的所有 Validaton

    【讨论】:

    • AllowHtml 用作模型成员装饰属性效果很好!
    【解决方案2】:

    ValidateInput 和 AllowHTML 与XSS 安全问题直接相关

    所以让我们先试着了解一下 XSS。

    XSS(跨站点脚本)是一种安全攻击,攻击者在进行数据输入时注入恶意代码。现在好消息是,在 MVC 中默认情况下会阻止 XSS。因此,如果有人试图发布 JavaScript 或 HTML 代码,他会出现以下错误。

    但在实时情况下,必须允许使用 HTML,例如 HTML 编辑器。因此,对于这些场景,您可以使用以下属性来装饰您的操作。

    [ValidateInput(false)]
    public ActionResult PostProduct(Product obj)
    {
        return View(obj);
    }
    

    但是等等,这里有一个问题。问题是我们已经允许 HTML 出现在可能很危险的完整动作上。因此,如果我们能够对字段或属性级别进行更精细的控制,这将真正创建一个整洁、专业的解决方案。

    这就是 AllowHTML 有用的地方。您可以在下面的代码中看到我在产品类属性级别上修饰了“AllowHTML”。

    public class Product
    {
        public string ProductName { get; set; }
        [AllowHtml]
        public string ProductDescription { get; set; }
    }
    

    因此,总结“ValidateInput”允许在操作级别发布脚本和 HTML,而“AllowHTML”则在更精细的级别。

    我建议您更多地使用“AllowHTML”,直到您非常确定整个操作需要裸露为止。

    我建议您阅读博文Preventing XSS Attacks in ASP.NET MVC using ValidateInput and AllowHTML,其中通过示例逐步说明这两个属性的重要性。

    【讨论】:

    • 很高兴在这里见到您,先生。你的很多帖子对我的代码项目很有用。
    • 在您的示例中,如果用户将 html 输入到 ProductName 字段中,仍然会出现错误(如预期的那样)。有没有办法呈现更用户友好的错误消息。此错误似乎忽略了自定义错误配置。
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多