2014-09-02 93 views
33

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

我发现2种方式来做到这一点,与[ValidateInput(false)]装饰控制器方法或装饰ViewModel属性与[AllowHtml]

给我,[AllowHtml]看起来更漂亮,但我只发现方法使用1次和[ValidateInput(false)]接缝是首选方式。

所以我想知道你在想什么,我应该使用哪一个? 2之间有什么区别?

TKS

回答

83

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

很高兴在这里见到你先生。很多你的帖子对我来说在代码项目上很有用。 – 2016-02-20 14:52:54

+1

在您的示例中,如果用户要将“html”输入到“ProductName”字段中,则仍会显示错误(如预期的那样)。有没有办法提供更加用户友好的错误信息。这个错误似乎忽略了自定义错误配置。 – philreed 2016-04-14 09:26:55

相关问题