允许用户在ASP.NET MVC中输入HTML - ValidateInput或AllowHtml

时间:2010-09-01 19:04:35

标签: asp.net-mvc validation validate-request

如何允许用户使用ASP.net MVC将HTML输入特定字段。

我有一个很长的表单,其中有很多字段被映射到控制器中的这个复杂对象。

我想让一个字段(描述)允许HTML,我将在稍后的时候开始自己的卫生。

11 个答案:

答案 0 :(得分:151)

在控制器中添加以下属性操作(post),以允许HTML:

[ValidateInput(false)] 

修改根据Charlino评论:

在您的web.config中设置使用的验证模式。见MSDN

<httpRuntime requestValidationMode="2.0" />

编辑2014年9月:根据sprinter252评论:

您现在应该使用[AllowHtml]属性。请参阅下面的MSDN

  

对于ASP.NET MVC 3应用程序,当您需要将HTML发布回   你的模型,不要使用ValidateInput(false)来关闭Request   验证。只需将[AllowHtml]添加到您的模型属性中,如下所示:

public class BlogEntry {
    public int UserId {get;set;}
    [AllowHtml] 
    public string BlogText {get;set;}
 }

答案 1 :(得分:125)

属性上方[AllowHtml]属性怎么样?

答案 2 :(得分:42)

添加到型号:

using System.Web.Mvc;

到你的财产

        [AllowHtml]
        [Display(Name = "Body")]
        public String Body { get; set; }

此代码从我的观点来看避免此错误的最佳方法。如果您使用的是HTML编辑器,则不会出现安全问题,因为它已经受到限制。

答案 3 :(得分:9)

在特定属性上添加[AllowHtml]是推荐的解决方案,因为有大量博客和评论暗示降低安全级别,这应该是不可接受的。

通过添加它,MVC框架将允许命中Controller并执行该控制器中的代码。

但是,这取决于您的代码,过滤器等,如何生成响应以及是否有任何可能触发其他类似错误的进一步验证。

在任何情况下,添加[AllowHtml]属性都是正确的答案,因为它允许在控制器中反序列化html。 viewmodel中的示例:

[AllowHtml]
public string MessageWithHtml {get; set;}

答案 4 :(得分:6)

我遇到了同样的问题,尽管我在某些答案中描述了相关财产>>> class NArray(object): def __init__(self, arr): self.arr = arr def array(self): return self.arr def __eq__(self, other): if (other.arr is self.arr): return True return (self.arr == other.arr).all() def __ne__(self, other): return not (self == other) >>> a = array([0, 1]) >>> b = array([1, 0]) >>> l = [ NArray(a), NArray(b) ] >>> l.index(NArray(a)) 0 >>> l.index(NArray(b)) 1

在我的情况下,我有一个[System.Web.Mvc.AllowHtml]类,在 MVC验证发生之前访问Request对象(因此AllowHtml没有效果),这个访问引发{{1} }。

这意味着,访问Request对象的某些属性会隐式触发验证(在我的例子中是UnhandledExceptionFilter属性)。

MSDN

记录了防止验证的解决方案
  

要禁用请求中特定字段的请求验证(例如,对于输入元素或查询字符串值),请在获取项目时调用Request.Unvalidated方法,如以下示例所示

因此,如果你有这样的代码

[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client

将其更改为

Params

或者只使用似乎不会激活验证的var lParams = aRequestContext.HttpContext.Request.Params; if (lParams.Count > 0) { ... 属性

var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;

var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
  ...

答案 5 :(得分:2)

如果您需要为动作方法参数(与“模型属性”相对)允许html输入,则没有内置方法可以做到这一点,但您可以使用自定义模型绑定器轻松实现此目的:

public ActionResult AddBlogPost(int userId,
    [ModelBinder(typeof(AllowHtmlBinder))] string htmlBody)
{
    //...
}

AllowHtmlBinder代码:

public class AllowHtmlBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        var name = bindingContext.ModelName;
        return request.Unvalidated[name]; //magic happens here
    }
}

在我的博文中找到完整的源代码和说明:https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/

答案 6 :(得分:1)

我在使用NopCommerce开发电子商务网站时遇到了这个问题,我通过3种不同的方式得到了这个解决方案,就像之前的答案一样。但根据NopCommerce结构,我没有一次找到这三个。我刚刚看到他们只使用[AllowHtml]并且除了任何问题之外它工作得很好。如前所述question

我个人不喜欢[ValidateInput(false)],因为我正在跳过总模型实体检查,这是不安全的。但如果有人只写have a look here

[AllowHtml] 
public string BlogText {get;set;}

然后它只跳过单个属性,只允许特定属性并且几乎不检查所有其他实体。因此,它似乎比我的更好。

答案 7 :(得分:1)

在我的情况下,当与OutputCache操作过滤器结合使用时,AllowHtml属性不起作用。 This answer为我解决了这个问题。希望这有助于某人。

答案 8 :(得分:0)

URL编码数据对我来说也很好

例如

var data ='你好'

在发布前在浏览器中调用encodeURIComponent(data)

在服务器上调用HttpUtility.UrlDecode(received_data)进行解码

这样,您可以精确地控制允许哪些字段包含html

答案 9 :(得分:0)

例如,您可以在项目中使用[AllowHtml]

 [AllowHtml]
 public string Description { get; set; }

使用此代码对您安装此软件包的库进行分类

Install-Package Microsoft.AspNet.Mvc

使用此using

之后
using System.Web.Mvc;

答案 10 :(得分:0)

不幸的是,这里没有答案对我有用。

我最终使用了“自定义模型绑定”,并使用了第三方Sanitizer。

查看我的回答here