Разрешить пользователю вводить HTML в ASP.NET MVC - ValidateInput или AllowHtml - PullRequest
112 голосов
/ 01 сентября 2010

Как разрешить пользователю вводить HTML в определенное поле с помощью ASP.net MVC.

У меня есть длинная форма со многими полями, которые сопоставляются с этим сложным объектом в контроллере.

Я бы хотел, чтобы в одном поле (описании) был разрешен HTML-код, для которого я в дальнейшем настрою свои санитарные условия.

Ответы [ 9 ]

153 голосов
/ 01 сентября 2010

Добавьте следующий атрибут действие (post) в контроллере, для которого вы хотите разрешить HTML:

[ValidateInput(false)] 

Редактировать: Согласно Чарлино комментарии:

В вашем web.config установите используемый режим проверки. См. MSDN :

<httpRuntime requestValidationMode="2.0" />

Редактировать в сентябре 2014: Согласно 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;}
 }
126 голосов
/ 30 июля 2012

Как насчет [AllowHtml] атрибута над свойством?

42 голосов
/ 25 марта 2013

Добавить в модель:

using System.Web.Mvc;

И в вашу собственность

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

Этот код с моей точки зрения лучше всего избежать этой ошибки.Если вы используете редактор HTML, у вас не будет проблем с безопасностью, поскольку он уже ограничен.

9 голосов
/ 07 мая 2015

Добавление [AllowHtml] к определенному свойству является рекомендуемым решением, так как существует множество блогов и комментариев, предлагающих снизить уровень безопасности, что должно быть неприемлемо.

Если добавить это, инфраструктура MVC позволитКонтроллер, который должен быть запущен, и код в этом контроллере, который должен быть выполнен.

Однако, от вашего кода, фильтров и т. д. зависит, как генерируется ответ, и есть ли дальнейшая проверка, которая может вызвать другой аналогошибка.

В любом случае добавление атрибута [AllowHtml] является правильным ответом, поскольку позволяет десериализовать html в контроллере.Пример в вашей viewmodel:

[AllowHtml]
public string MessageWithHtml {get; set;}
6 голосов
/ 24 ноября 2015

Я столкнулся с той же проблемой, хотя я добавил [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)
{
  ...
2 голосов
/ 11 июня 2018

Если вам нужно разрешить ввод 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 голос
/ 18 февраля 2017

В моем случае атрибут AllowHtml не работал в сочетании с фильтром действий OutputCache. Этот ответ решил проблему для меня. Надеюсь, это кому-нибудь поможет.

1 голос
/ 12 января 2017

Я столкнулся с этой проблемой при разработке сайта электронной коммерции с использованием NopCommerce, я получил это решение тремя различными способами, как и в предыдущих ответах.Но, согласно структуре NopCommerce, я не нашел эти три одновременно.Я только что видел, что там они используют только [AllowHtml], и он работает нормально, за исключением любой проблемы.Как ранее задавалось вопрос

Лично я не предпочитаю [ValidateInput(false)], потому что я пропускаю полную проверку сущности модели, что небезопасно.Но если кто-то просто напишет , посмотрите здесь

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

, тогда он просто пропускает только одно свойство, разрешает только определенное свойство и проверяет почти все остальные объекты.Поэтому это кажется предпочтительным по отношению к моему.

0 голосов
/ 21 августа 2018

URL Кодирование данных работает и для меня

Например

var data = ' Hello '

В браузере вызовите encodeURIComponent (data) перед публикацией

На сервере вызовите HttpUtility.UrlDecode (полученный_данные) для декодирования

Таким образом, вы можете точно контролировать, в какой области полей может быть html

...