Se detectó un valor Request.Form potencialmente peligroso desde el cliente

Resuelto Radu094 asked hace 16 años • 48 respuestas

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 .Textpropiedad de mi cuadro de texto serásomething & lt; html & gt;

¿Hay alguna manera de hacer esto desde un controlador?

Radu094 avatar Sep 17 '08 17:09 Radu094
Aceptado

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 ).

JacquesB avatar Sep 17 '2008 11:09 JacquesB

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
Zack Peterson avatar Oct 08 '2009 22:10 Zack Peterson

En ASP.NET MVC (a partir de la versión 3), puede agregar el AllowHtmlatributo 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; }
Anthony Johnston avatar Sep 05 '2011 09:09 Anthony Johnston

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 aspxlas 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 .aspxespecificando:

requestValidationMode="2.0"

Puede deshabilitar la validación de solicitudes por completo especificando:

validateRequest="false"
JordanC avatar Jul 30 '2010 04:07 JordanC