Se detectó un valor Request.Form potencialmente peligroso desde el cliente
Cada vez que un usuario publica algo que contiene <
o >
está en una página de mi aplicación web, se produce esta excepción.
No quiero entrar en la discusión sobre la inteligencia de lanzar una excepción o bloquear una aplicación web completa porque alguien ingresó un carácter en un cuadro de texto, pero estoy buscando una forma elegante de manejar esto.
Atrapando la excepción y mostrando
Se ha producido un error. Vuelva atrás y vuelva a escribir el formulario completo, pero esta vez no utilice <
No me parece lo suficientemente profesional.
Deshabilitar la validación de publicaciones ( validateRequest="false"
) definitivamente evitará este error, pero dejará la página vulnerable a una serie de ataques.
Idealmente: cuando se produce una devolución que contiene caracteres HTML restringidos, ese valor publicado en la colección de formularios se codificará automáticamente en HTML. Entonces la .Text
propiedad de mi cuadro de texto serásomething & lt; html & gt;
¿Hay alguna manera de hacer esto desde un controlador?
Creo que lo estás atacando desde el ángulo equivocado al intentar codificar todos los datos publicados.
Tenga en cuenta que " <
" también podría provenir de otras fuentes externas, como un campo de base de datos, una configuración, un archivo, un feed, etc.
Además, " <
" no es inherentemente peligroso. Sólo es peligroso en un contexto específico: cuando se escriben cadenas que no han sido codificadas en la salida HTML (debido a XSS).
En otros contextos, diferentes subcadenas son peligrosas; por ejemplo, si escribe una URL proporcionada por el usuario en un enlace, la subcadena " javascript:
" puede ser peligrosa. Por otro lado, el carácter de comilla simple es peligroso al interpolar cadenas en consultas SQL, pero es perfectamente seguro si es parte de un nombre enviado desde un formulario o leído desde un campo de base de datos.
La conclusión es: no puedes filtrar entradas aleatorias para personajes peligrosos, porque cualquier personaje puede ser peligroso en las circunstancias adecuadas. Debe codificar en el punto en el que algunos caracteres específicos puedan volverse peligrosos porque cruzan a un sublenguaje diferente donde tienen un significado especial. Cuando escribes una cadena en HTML, debes codificar caracteres que tengan un significado especial en HTML, usando Server.HtmlEncode. Si pasa una cadena a una declaración SQL dinámica, debe codificar diferentes caracteres (o mejor, dejar que el marco lo haga por usted utilizando declaraciones preparadas o similares).
Cuando esté seguro de codificar HTML en todos los lugares donde pasa cadenas a HTML, luego configúrelo ValidateRequest="false"
en la <%@ Page ... %>
directiva en su .aspx
(s) archivo(s).
En .NET 4 es posible que tengas que hacer un poco más. A veces es necesario agregar también <httpRuntime requestValidationMode="2.0" />
a web.config ( referencia ).
Hay una solución diferente para este error si estás usando ASP.NET MVC:
- ASP.NET MVC: ¿las páginas validarRequest=false no funcionan?
- ¿Por qué ValidateInput(False) no funciona?
- ASP.NET MVC RC1, VALIDATEINPUT, UNA SOLICITUD PELIGROSA POTENCIAL Y EL ERROR
Ejemplo de C#:
[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
// ...
}
Ejemplo de Visual Basic:
<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
...
End Function
En ASP.NET MVC (a partir de la versión 3), puede agregar el AllowHtml
atributo a una propiedad en su modelo.
Permite que una solicitud incluya marcado HTML durante el enlace del modelo omitiendo la validación de la solicitud para la propiedad.
[AllowHtml]
public string Description { get; set; }
Si está en .NET 4.0, asegúrese de agregar esto en su archivo web.config<system.web>
dentro de las etiquetas:
<httpRuntime requestValidationMode="2.0" />
En .NET 2.0, la validación de solicitudes solo se aplicaba a aspx
las solicitudes. En .NET 4.0, esto se amplió para incluir todas las solicitudes. Puede volver a realizar únicamente la validación XSS durante el procesamiento .aspx
especificando:
requestValidationMode="2.0"
Puede deshabilitar la validación de solicitudes por completo especificando:
validateRequest="false"