Разрешить пользователю вводить HTML в ASP.NET MVC - ValidateInput или AllowHtml
Как я могу позволить пользователю вводить HTML в определенное поле, используя ASP.net MVC.
У меня есть длинная форма со многими полями, которые сопоставляются с этим сложным объектом в контроллере.
Я хотел бы сделать одно поле (описание) разрешить HTML, который я буду предварительно отрегулировать мои собственные санитарии на более позднем этапе.
9 ответов
Добавьте следующий атрибут action (post) в контроллере, для которого вы хотите разрешить HTML:
[ValidateInput(false)]
Редактировать: В соответствии с комментариями Charlino:
В вашем 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;} }
Добавить к модели:
using System.Web.Mvc;
И к вашей собственности
[AllowHtml]
[Display(Name = "Body")]
public String Body { get; set; }
Этот код с моей точки зрения лучший способ избежать этой ошибки. Если вы используете редактор HTML, у вас не будет проблем с безопасностью, потому что он уже ограничен.
Я столкнулся с той же проблемой, хотя я добавил [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)
{
...
Добавление [AllowHtml]
Для конкретного свойства рекомендуется решение, так как существует множество блогов и комментариев, предлагающих снизить уровень безопасности, что должно быть неприемлемым.
Добавляя это, инфраструктура MVC позволит ударить контроллер и выполнить код в этом контроллере.
Однако это зависит от вашего кода, фильтров и т. Д. От того, как генерируется ответ, и от того, есть ли дальнейшая проверка, которая может вызвать другую подобную ошибку.
В любом случае добавление [AllowHtml]
Атрибут является правильным ответом, так как он позволяет десериализовать html в контроллере. Пример в вашей viewmodel:
[AllowHtml]
public string MessageWithHtml {get; set;}
Если вам нужно разрешить ввод 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/
URL-кодирование данных работает для меня
Например
var data = 'Hello b>'
В браузере вызовите encodeURIComponent(data) перед публикацией
На сервере вызов HttpUtility.UrlDecode(полученный_данных) для декодирования
Таким образом, вы можете точно контролировать, в какой области полей может быть html
Ты можешь использовать [AllowHtml]
К вашему проекту, например
[AllowHtml]
public string Description { get; set; }
Для использования этого кода в библиотеке классов вы устанавливаете этот пакет
Install-Package Microsoft.AspNet.Mvc
После использования этого using
using System.Web.Mvc;
Я столкнулся с этой проблемой во время разработки сайта электронной коммерции с использованием NopCommerce, я получил это решение тремя различными способами, как и предыдущие ответы. Но, согласно структуре NopCommerce, я не нашел эти три одновременно. Я только что видел, что там они используют только [AllowHtml]
и он работает нормально, кроме любой проблемы. Как ранее заданный вопрос
Лично я не предпочитаю [ValidateInput(false)]
потому что я пропускаю полную проверку сущности модели, что небезопасно. Но если кто-то просто напишет , посмотрите здесь
[AllowHtml]
public string BlogText {get;set;}
тогда он просто пропускает только одно свойство и разрешает только определенное свойство и проверяет едва ли все остальные объекты. Поэтому это кажется предпочтительным по отношению к моему.
В моем случае атрибут AllowHtml не работал в сочетании с фильтром действия OutputCache. Этот ответ решил проблему для меня. Надеюсь, это кому-нибудь поможет.
К сожалению, ни один из ответов здесь не помог мне.
В итоге я использовал Custom Model Binding и сторонний Sanitizer.
См. Мой вопрос с самоответом здесь.