Asp.net mvc 4 ValidateInput(false)与AllowHtml

Asp.net mvc 4 ValidateInput(false)与AllowHtml,asp.net-mvc-4,viewmodel,richtext,Asp.net Mvc 4,Viewmodel,Richtext,我有一个用于创建备忘录的表单,为此我使用富文本编辑器提供一些样式,这将创建html标记以应用样式。当我发布该文本时,mvc会抛出一个错误以防止潜在的危险脚本,因此我必须特别允许它 我找到了两种方法,一种是用[ValidateInput(false)]装饰控制器方法,另一种是用[allowtml]装饰ViewModel属性。对我来说,[allowtml]看起来更好,但我发现该方法只使用了一次,而[ValidateInput(false)]似乎是首选方法 我应该使用哪种方法以及两者之间的区别是什么?

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

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


我应该使用哪种方法以及两者之间的区别是什么?

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

因此,让我们首先尝试理解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”,直到你非常确定整个动作需要赤裸


我建议您阅读这篇博客文章,它通过一个例子一步一步地演示了这两个属性的重要性。

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

很高兴在这里见到您,先生。您的许多帖子对我的代码项目很有用。在您的示例中,如果用户在
ProductName
字段中输入html,仍然会显示错误(如预期的那样)。是否有一种方法可以显示更用户友好的错误消息。此错误似乎忽略了自定义错误配置。