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

Rab*_*bbi 118 validation asp.net-mvc validate-request

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

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

我想创建一个字段(描述)允许HTML,我将在稍后的时间内完成我自己的卫生设施.

Kel*_*sey 159

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

[ValidateInput(false)] 
Run Code Online (Sandbox Code Playgroud)

编辑:根据查理诺的评论:

在您的web.config中设置使用的验证模式.请参阅MSDN:

<httpRuntime requestValidationMode="2.0" />
Run Code Online (Sandbox Code Playgroud)

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

您现在应该使用该[AllowHtml]属性.从MSDN中查看以下内容:

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

public class BlogEntry {
    public int UserId {get;set;}
    [AllowHtml] 
    public string BlogText {get;set;}
 }
Run Code Online (Sandbox Code Playgroud)

  • MSDN(http://msdn.microsoft.com/de-de/magazine/hh708755.aspx)说,您不应该使用ValidateInpute并改为使用AllowHtmlAttribute.(没找到英文版) (20认同)
  • 编辑有希望解决最近制作的3张选票...这是一个4岁的答案:) (8认同)
  • 对于不包括降级请求验证模式的.NET 4,真的没有解决方案吗? (3认同)
  • @djack109 通常,您不使用 EF 模型作为视图模型。您将编写一个单独的类来表示 CRUD 操作的实际数据。这样,当您的 EF6 模型重新生成时,不会丢失任何内容。您还应该缩小模型,使其仅具有执行手头任务所需的属性。 (3认同)

cry*_*yss 129

什么[AllowHtml]上述财产属性?

  • 这对我来说似乎是一种更好的方式,避免改变任何全局行为.我刚刚通过将此属性添加到模型上的属性来解决了我的问题. (5认同)
  • 完全同意Chris解决方案,如果你只需要一个模型中的一个属性来接受html输入,就没有理由禁用整个应用程序的html验证.删除web.config中的验证将在您的应用程序中打开一个大的安全漏洞. (2认同)

小智 42

添加到模型:

using System.Web.Mvc;
Run Code Online (Sandbox Code Playgroud)

并对你的财产

        [AllowHtml]
        [Display(Name = "Body")]
        public String Body { get; set; }
Run Code Online (Sandbox Code Playgroud)

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


ibe*_*dev 9

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

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

但是,它取决于您的代码,过滤器等,如何生成响应以及是否存在可能触发另一个类似错误的进一步验证.

无论如何,添加[AllowHtml]属性是正确的答案,因为它允许在控制器中反序列化html.viewmodel中的示例:

[AllowHtml]
public string MessageWithHtml {get; set;}
Run Code Online (Sandbox Code Playgroud)


ViR*_*iTy 7

我遇到了同样的问题,虽然我添加[System.Web.Mvc.AllowHtml]了一些答案中描述的有关财产.

在我的情况下,我有一个UnhandledExceptionFilter MVC验证发生之前访问Request对象(因此AllowHtml没有效果),这个访问引发了一个[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client.

这意味着,访问Request对象的某些属性会隐式触发验证(在我的情况下是其Params属性).

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

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

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

var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
  ...
Run Code Online (Sandbox Code Playgroud)

改为

var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;

var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
  ...
Run Code Online (Sandbox Code Playgroud)

或者只是使用Form似乎没有激活验证的属性

var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
  ...
Run Code Online (Sandbox Code Playgroud)