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

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

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

我想让一个字段(描述)允许 HTML,我将预先形成我自己的卫生在稍后的一点。

116821 次浏览

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

[ValidateInput(false)]

编辑: 根据 Charlino评论:

在 web.config 中设置所使用的验证模式,参见 MSDN:

<httpRuntime requestValidationMode="2.0" />

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

您现在应该使用 [AllowHtml]属性:

对于 ASP.NET MVC 3应用程序,当需要将 HTML 发布回 your model, don’t use ValidateInput(false) to turn off Request Validation. Simply add [AllowHtml] to your model property, like so:

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

属性上面的 [AllowHtml]属性怎么样?

添加到模型:

using System.Web.Mvc;

还有你的财产

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

这段代码从我的观点来说是避免这个错误的最好方法。如果您正在使用 HTML 编辑器,您将不会有安全问题,因为它已经受到限制。

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

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

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

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

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

我面临同样的问题,虽然我增加了 [System.Web.Mvc.AllowHtml]的相关属性,在一些答案中描述。

在我的例子中,我有一个 UnhandledExceptionFilter类,它可以访问 Request 对象 之前 MVC 验证(因此 AllowHtml 没有效果) ,并且这种访问会产生一个 [HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client

This means, accessing certain properties of a Request object implicitly fires validation (in my case its the Params property).

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

若要禁用请求中特定字段的请求验证(例如,输入元素或查询字符串值) ,请调用 Request。获取项时使用未验证的方法,如下面的示例所示

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

var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
...

change it to

var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;


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

或者只使用 Form属性,它似乎不触发验证

var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
...

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

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

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

然后只跳过单个属性,只允许特定的属性,几乎不检查所有其他实体。所以看起来比较适合我。

在我的示例中,AllowHtml 属性与 OutputCache 操作筛选器组合时无法工作。This answer帮我解决了这个问题。希望这对谁有帮助。

如果你需要为 action-method parameter允许 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/中找到完整的源代码和解释

对数据进行 URL 编码对我来说也很有用

比如说

Var data =’< b > Hello ’

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

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

这样,您就可以精确地控制哪些字段区域允许拥有 html

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

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

用于将此代码用于类库,请安装此包

Install-Package Microsoft.AspNet.Mvc

使用此 using

using System.Web.Mvc;

不幸的是,这里所有的答案对我都不起作用。

我最终使用了自定义模型绑定并使用了第三方消毒器。

见我的自我回答问题 给你