asp.net-mvc - net - mvc validation model
Permitir al usuario ingresar HTML en ASP.NET MVC-ValidateInput o AllowHtml (7)
¿Qué [AllowHtml]
atributo [AllowHtml]
arriba de la propiedad?
¿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.
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.
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 :
<httpRuntime requestValidationMode="2.0" />
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;} }
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 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é 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 question
[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.
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)
{
...