Разрешить пользователю вводить HTML в ASP.NET MVC - ValidateInput или AllowHtml

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

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

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

Ответ 1

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

[ValidateInput(false)] 

Изменить: По Charlino комментариям:

В вашем web.config задан режим проверки. См. MSDN:

<httpRuntime requestValidationMode="2.0" />

Изменить сентябрь 2014: По sprinter252 комментариям:

Теперь вы должны использовать атрибут [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;}
 }

Ответ 2

Что относительно атрибута [AllowHtml] выше свойства?

Ответ 3

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

using System.Web.Mvc;

И к вашей собственности

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

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

Ответ 4

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

Добавив, что структура MVC позволит Controller быть нажата, а код в этом контроллере будет выполнен.

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

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

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

Ответ 5

У меня возникла такая же проблема, хотя я добавил [System.Web.Mvc.AllowHtml] к соответствующему свойству, как описано в некоторых ответах.

В моем случае у меня есть класс UnhandledExceptionFilter, который обращается к объекту Request до проверки 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)
{
  ...

Ответ 6

Если вам нужно разрешить ввод html для параметра action-method (в отличие от "свойства модели"), встроенного способа сделать это нет, но вы можете легко добиться этого, используя привязку пользовательской модели:

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

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

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

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

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

Ответ 8

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

Ответ 9

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

Например

var data = '<b> Hello </b>'

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

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

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