Permitir al usuario ingresar HTML en ASP.NET MVC – ValidateInput o AllowHtml

¿Cómo puedo permitir que un usuario ingrese HTML en un campo en particular usando ASP.net MVC?

Tengo una forma larga con muchos campos que se asignan a este objeto complejo en el controlador.

Me gustaría hacer que un campo (la descripción) permita el HTML en el que preformaré mi propio saneamiento en un momento posterior.

    Agregue el siguiente atributo la acción (publicación) en el controlador para el que desea permitir HTML:

    [ValidateInput(false)] 

    Editar: según comentarios de Charlino :

    En su web.config configure el modo de validación utilizado. Ver MSDN :

      

    Edición de septiembre de 2014: según sprinter252 comenta:

    Ahora debería usar el atributo [AllowHtml] . Vea a continuación desde MSDN :

    Para las aplicaciones ASP.NET MVC 3, cuando necesite volver a enviar HTML a su modelo, no use ValidateInput (false) para desactivar Validación de solicitud. Simplemente agregue [AllowHtml] a la propiedad de su modelo, así:

     public class BlogEntry { public int UserId {get;set;} [AllowHtml] public string BlogText {get;set;} } 

    ¿Qué [AllowHtml] atributo [AllowHtml] arriba de la propiedad?

    Añadir al modelo:

     using System.Web.Mvc; 

    Y a su propiedad

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

    Este código de mi punto es la mejor manera de evitar este error. Si usa el editor de HTML, no tendrá problemas de seguridad porque ya está restringido.

    La solución recomendada es agregar [AllowHtml] en la propiedad específica ya que hay muchos blogs y comentarios que sugieren que se disminuirá el nivel de seguridad, lo que debería ser inaceptable.

    Al agregar eso, el marco MVC permitirá que el controlador sea golpeado y el código en ese controlador para ser ejecutado.

    Sin embargo, depende de su código, filtros, etc. cómo se genera la respuesta y si existe alguna otra validación que pueda desencadenar otro error similar.

    En cualquier caso, agregar el atributo [AllowHtml] es la respuesta correcta, ya que permite que html se deserialice en el controlador. Ejemplo en tu viewmodel:

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

    Me enfrenté al mismo problema aunque agregué [System.Web.Mvc.AllowHtml] a la propiedad concerniente como se describe en algunas respuestas.

    En mi caso, tengo una clase UnhandledExceptionFilter que accede al objeto Request antes de que tenga lugar la validación MVC (y por lo tanto AllowHtml no tiene efecto) y este acceso genera una [HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client .

    Esto significa que el acceso a ciertas propiedades de un objeto Request implícitamente activa la validación (en mi caso es la propiedad Params ).

    Una solución para evitar la validación está documentada en MSDN

    Para deshabilitar la validación de solicitud para un campo específico en una solicitud (por ejemplo, para un elemento de entrada o valor de cadena de consulta), llame al método Request.Unvalidated cuando obtiene el elemento, como se muestra en el siguiente ejemplo

    Por lo tanto, si tienes un código como este

     var lParams = aRequestContext.HttpContext.Request.Params; if (lParams.Count > 0) { ... 

    cambiarlo a

     var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated; var lForm = lUnvalidatedRequest.Form; if (lForm.Count > 0) { ... 

    o simplemente use la propiedad Form que no parece activar la validación

     var lForm = aRequestContext.HttpContext.Request.Form; if (lForm.Count > 0) { ... 

    Si necesita permitir la entrada de html para el parámetro de método de acción (opuesto a “propiedad del modelo”), no hay una manera incorporada de hacerlo, pero puede lograrlo fácilmente usando una carpeta de modelo personalizada:

     public ActionResult AddBlogPost(int userId, [ModelBinder(typeof(AllowHtmlBinder))] string htmlBody) { //... } 

    El código 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 } } 

    Encuentre el código fuente completo y la explicación en mi blog: https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/

    Me enfrenté a este problema durante el desarrollo de un sitio de comercio electrónico usando NopCommerce. Obtuve esta solución de 3 maneras diferentes, como las respuestas anteriores. Pero de acuerdo con la estructura de NopCommerce, no encontré esos tres a la vez. Acabo de ver que están usando solo [AllowHtml] y está funcionando bien, excepto en cualquier problema. Como pregunta previamente hecha

    Personalmente, no prefiero [ValidateInput(false)] porque omito la verificación total de la entidad del modelo, que es inseguro. Pero si alguien solo escribe echa un vistazo aquí

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

    luego solo omite una sola propiedad, y solo permite solo una propiedad en particular y verifica apenas las demás entidades. Por lo tanto, parece preferible a la mía.

    En mi caso, el atributo AllowHtml no funcionaba cuando se combinaba con el filtro de acción OutputCache. Esta respuesta resolvió el problema para mí. Espero que esto ayude a alguien.

    La encoding de URL también funciona para mí

    Por ejemplo

    var data = ‘ Hola ‘

    En la llamada al navegador codificarURIComponent (datos) antes de publicar

    En el servidor, llame a HttpUtility.UrlDecode (received_data) para decodificar

    De esta forma puede controlar exactamente qué área de campos permite tener html