ValidateInput(false)vs AllowHtml

时间:2014-09-02 18:41:53

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

我有一个用于创建备忘录的表单,为此我使用富文本编辑器来提供一些样式,这会创建html标签以便应用样式。当我发布该文本时,mvc会抛出错误以防止可能存在危险的脚本,因此我必须特别允许它。

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

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

2 个答案:

答案 0 :(得分:107)

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

因此,让我们首先尝试理解XSS。

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

Enter image description here

但是实时存在必须允许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 ,其中通过示例逐步说明这两个属性的重要性。

答案 1 :(得分:0)

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