我有一个用于创建备忘录的表单,为此,我正在使用RTF编辑器提供一些样式,这将创建html标签以应用样式。当我发布该文本时,mvc会抛出一个错误以防止潜在危险的脚本,因此我必须专门允许它。
我发现这样做的两种方法,一种是用[ValidateInput(false)]
装饰 Controller 方法,另一种是用ViewModel
装饰[AllowHtml]
属性。对我来说,[AllowHtml]
看起来更好,但我只发现该方法使用了1次,而[ValidateInput(false)]
似乎是首选方法。
我应该使用哪种方法,两者之间有什么区别?
最佳答案
ValidateInput和AllowHTML与XSS安全问题直接相关。
因此,让我们首先尝试了解XSS。
XSS(跨站点脚本)是一种安全攻击,攻击者在进行数据输入时会注入(inject)恶意代码。现在好消息是,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”,直到您完全确定整个 Action 都需要裸露为止。
我建议您阅读博文Preventing XSS Attacks in ASP.NET MVC using ValidateInput and AllowHTML,该博文通过示例逐步说明这两个属性的重要性。