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


120

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

我的表单很长,包含许多字段,这些字段已映射到控制器中的此复杂对象。

我想使一个字段(描述)允许HTML,稍后我将对其进行卫生处理。


3
对于将来的访问者:IMHO,Chris J或Eugene Bosikov的答案要好于ASP.NET MVC更高版本所接受的答案,尤其是如果您只想在一个字段中允许HTML时。
lc。

Answers:


163

在要允许HTML用于的控制器中,将以下属性添加到动作(发布)中:

[ValidateInput(false)] 

编辑:根据查利诺评论:

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

<httpRuntime requestValidationMode="2.0" />

编辑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;}
 }

1
如果您使用的是.NET 4,则还必须<httpRuntime requestValidationMode="2.0" />在web.config文件中进行设置。
Charlino 2010年

3
.NET 4是否真的没有不包括降级请求验证模式的解决方案?
bzlm

20
MSDN(msdn.microsoft.com/de-de/magazine/hh708755.aspx)说,您不应该使用ValidateInpute并改用AllowHtmlAttribute。(未找到英语版本)
亚历山大·施密特

8
进行编辑以希望解决最近做出的3次否决...这是一个有4年历史的答案:)
Kelsey 2014年

1
@ djack109通常,您不使用EF模型作为视图模型。您将编写一个单独的类,代表您的CRUD操作的实际数据。这样,当您重新生成EF6模型时,不会丢失任何内容。您还应该简化模型,使其仅具有执行手头任务所需的属性。
艾伦·克拉克·科普兰(Allen Clark Copeland Jr)

131

那么[AllowHtml]属性之上的属性呢?


5
对我来说,这似乎是一种更好的方法,避免更改任何全球行为。通过将属性添加到模型的属性中,我已经解决了我的问题。
乔纳森·赛斯

2
在这里完全同意Chris解决方案,如果您只需要模型中的一个属性就可以接受html输入,则没有理由为整个应用程序禁用html验证。在web.config中删除验证将在您的应用程序中打开一个很大的安全漏洞。
米格尔

1
不幸的是,如果您使用的是MetadataTypeAttribute
dav_i,

@dav_i:此解决方案可以很好MetadataTypeAttribute地工作,并且更可取,因为它只允许在单个字段上使用HTML,而不是整个对象。
编码

@TrueBlueAussie,我已经在我的mvc 4.0环境中尝试了几个小时,尽管AllowHtml应该可以正常工作。我不得不承认失败并选择了一个不太安全的选择,那就是裤子。AllowHtml似乎不能与MetadataTypeAttribute的使用一起使用
julian guppy

42

添加到模型:

using System.Web.Mvc;

和你的财产

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

从我的角度来看,这段代码是避免此错误的最佳方法。如果使用的是HTML编辑器,则不会受到安全性问题的限制。


9

新增中 [AllowHtml]特定的属性,因为有很多博客和评论建议降低安全级别,这是不可接受的。

通过添加这些内容,MVC框架将允许对Controller进行点击并执行该Controller中的代码。

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

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

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

8

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

就我而言,我有一个 MVC验证发生之前UnhandledExceptionFilter访问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)
{
  ...

更改为

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

1
谢谢!Request.Unvalidated是唯一适合我的解决方案。
佩特·伊瓦尔森

3

如果您需要允许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/


1
未经验证的似乎仅在框架4.5及更高版本中可用。

@本正确!请检查此修改后的解决方案。 stackoverflow.com/questions/59483284/...
OM-HA

3

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

例如

var data ='<b>你好</ b>'

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

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

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


迄今为止最简单的方法
N1gthm4r3

1

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

我个人不喜欢,[ValidateInput(false)]因为我跳过了总模型实体检查,这是不安全的。但是如果有人写的话在这里看看

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

那么它仅跳过单个属性,仅允许特定属性,几乎不检查所有其他实体。因此,对我来说似乎是可取的。


1

就我而言,与OutputCache操作过滤器组合使用时,AllowHtml属性不起作用。这个答案为我解决了问题。希望这对某人有帮助。


1

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

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

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

Install-Package Microsoft.AspNet.Mvc

使用后 using

using System.Web.Mvc;

0

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

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

在这里查看我的自我解答。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.