【问题标题】:Allow User to input HTML in ASP.NET MVC - ValidateInput or AllowHtml允许用户在 ASP.NET MVC 中输入 HTML - ValidateInput 或 AllowHtml
【发布时间】:2011-04-06 23:34:55
【问题描述】:

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

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

我想让一个字段(描述)允许使用 HTML,稍后我将自行整理。

【问题讨论】:

  • 对于未来的访问者:恕我直言,Chris J 或 Eugene Bosikov 的答案比 ASP.NET MVC 更高版本接受的答案更好,特别是如果您只想在一个字段中允许 HTML。

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


【解决方案1】:

在你想要允许 HTML 的控制器中添加以下属性:

[ValidateInput(false)] 

编辑:根据Charlino cmets:

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

<httpRuntime requestValidationMode="2.0" />

2014 年 9 月编辑: 根据sprinter252 cmets:

您现在应该使用[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;}
 }

【讨论】:

  • 如果您使用的是 .NET 4,您还必须在 web.config 文件中设置 &lt;httpRuntime requestValidationMode="2.0" /&gt;
  • .NET 4 真的没有不包括降级请求验证模式的解决方案吗?
  • MSDN (msdn.microsoft.com/de-de/magazine/hh708755.aspx) 说,您不应该使用 ValidateInpute 而是使用 AllowHtmlAttribute。 (没找到英文版)
  • 进行了编辑以希望解决最近做出的 3 次反对票...这是一个 4 岁的答案 :)
  • @djack109 通常,您不会将 EF 模型用作视图模型。您将编写一个单独的类来表示您的 CRUD 操作的实际数据。这样,当您的 EF6 模型重新生成时,不会丢失任何内容。您还应该精简模型,使其仅具有执行手头任务所需的属性。
【解决方案2】:

[AllowHtml] 属性上面的属性呢?

【讨论】:

  • 这对我来说似乎是一个更好的方法,避免改变任何全局行为。我刚刚通过将此属性添加到模型上的属性来解决我的问题。
  • 在这里完全同意 Chris 的解决方案,如果您只需要模型中的一个属性来接受 html 输入,则没有理由禁用整个应用程序的 html 验证。删除 web.config 中的验证将在您的应用中打开一个很大的安全漏洞。
  • 很遗憾,如果您使用的是MetadataTypeAttribute,这将不起作用
  • @dav_i:此解决方案适用于 MetadataTypeAttribute,并且更可取,因为它只允许在单个字段上而不是整个对象上使用 HTML。
  • @TrueBlueAussie,我已经在我的 mvc 4.0 环境中尝试了几个小时,虽然 AllowHtml 应该可以工作,但它不起作用。我不得不承认失败并选择了一个不太安全的选择,那就是裤子。 AllowHtml 似乎不适用于 MetadataTypeAttribute
【解决方案3】:

添加到模型:

using System.Web.Mvc;

还有你的财产

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

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

【讨论】:

    【解决方案4】:

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

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

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

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

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

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,尽管我将[System.Web.Mvc.AllowHtml] 添加到一些答案中描述的相关属性中。

      在我的例子中,我有一个UnhandledExceptionFilter 类访问请求对象之前 MVC 验证发生(因此 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)
      {
        ...
      

      改成

      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)
      {
        ...
      

      【讨论】:

      • 谢谢! Request.Unvalidated 是唯一对我有用的解决方案。
      【解决方案6】:

      如果您需要允许 action-method 参数(与“模型属性”相反)的 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/

      【讨论】:

      【解决方案7】:

      对数据进行 URL 编码也适用于我

      例如

      var data = '你好'

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

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

      这样你就可以准确控制哪些字段区域允许有 html

      【讨论】:

      • 迄今为止最简单的方法
      【解决方案8】:

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

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

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

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

      【讨论】:

        【解决方案9】:

        在我的例子中,AllowHtml 属性在与 OutputCache 操作过滤器结合使用时不起作用。 This answer 为我解决了这个问题。希望这对某人有所帮助。

        【讨论】:

          【解决方案10】:

          您可以将[AllowHtml] 用于您的项目,例如

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

          为了使用这个代码到你安装这个包的类库

          Install-Package Microsoft.AspNet.Mvc
          

          使用后using

          using System.Web.Mvc;
          

          【讨论】:

            【解决方案11】:

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

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

            查看我的自我回答问题here

            【讨论】:

              猜你喜欢
              • 2014-10-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-05-08
              • 2016-03-12
              • 1970-01-01
              • 2014-07-17
              • 2010-12-12
              相关资源
              最近更新 更多