ValidateInput(false)vs AllowHtml

Eri*_*cGS 46 viewmodel richtext asp.net-mvc-4

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

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

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

Shi*_*ala 113

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

那么让我们首先尝试理解XSS.

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

在此输入图像描述

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

[ValidateInput(false)]
public ActionResult PostProduct(Product obj)
{
    return View(obj);
}
Run Code Online (Sandbox Code Playgroud)

但等等,这里有一个问题.问题是我们已经允许HTML完成可能很危险的操作.因此,如果我们可以对字段或属性级别进行更精细的控制,那么这将真正创建一个整洁,整洁和专业的解决方案.

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

public class Product
{
    public string ProductName { get; set; }
    [AllowHtml]
    public string ProductDescription { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

因此,总结"ValidateInput"允许脚本和HTML在动作级别上发布,而"AllowHTML"则更精细.

我建议更多地使用"AllowHTML",直到你非常确定整个动作需要裸露.

我建议你阅读博客文章使用ValidateInput和AllowHTML预防ASP.NET MVC中的XSS攻击,它通过一个例子逐步说明这两个属性的重要性.