Pregunta Se detectó un valor Request.Form potencialmente peligroso del cliente


Cada vez que un usuario publica algo que contiene < o > en una página de mi aplicación web, obtengo 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 personaje 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. Regrese y vuelva a escribir todo el formulario nuevamente, pero esta vez no use <

no parece lo suficientemente profesional para mí.

Deshabilitar la validación de la publicación (validateRequest="false") definitivamente evitará este error, pero dejará la página vulnerable a una serie de ataques.

Idealmente: cuando se produce una publicación posterior que contiene caracteres restringidos HTML, ese valor publicado en la colección Formulario se codificará automáticamente en HTML. Entonces el .Text propiedad de mi cuadro de texto será something & lt; html & gt;

¿Hay alguna manera de que pueda hacer esto desde un controlador?


1324
2017-09-17 10:58


origen


Respuestas:


Creo que lo estás atacando desde el ángulo equivocado al intentar codificar todos los datos publicados.

Tenga en cuenta que un "<"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 intrínsecamente peligroso. Es solo peligroso en un contexto específico: cuando se escriben cadenas que no han sido codificadas para salida de HTML (debido a XSS).

En otros contextos, las diferentes subcadenas son peligrosas, por ejemplo, si escribe una URL proporcionada por el usuario en un enlace, la subcadena "javascript:"puede ser peligroso. El carácter de comilla simple por otro lado 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 se puede filtrar la entrada aleatoria de caracteres peligrosos, porque cualquier personaje puede ser peligroso en las circunstancias adecuadas. Debería codificar en el punto donde algunos caracteres específicos pueden volverse peligrosos porque cruzan a un sublengua diferente donde tienen un significado especial. Cuando escribe una cadena en HTML, debe codificar los caracteres que tienen un significado especial en HTML, utilizando Server.HtmlEncode. Si pasa una cadena a una declaración SQL dinámica, debe codificar caracteres diferentes (o mejor, deje que el marco lo haga por usted usando declaraciones preparadas o similares).

Cuando está seguro de que codifica HTML en cualquier lugar donde pase cadenas a HTML, luego configure validateRequest="false" en el <%@ Page ... %> directiva en su .aspx archivo (s)

En .NET 4 es posible que deba hacer un poco más. A veces es necesario agregar también <httpRuntime requestValidationMode="2.0" /> a web.config (referencia)


995
2017-09-17 11:26



Hay una solución diferente a este error si está utilizando ASP.NET MVC:

Muestra C #:

[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
    // ...
}

Muestra de Visual Basic:

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
    ...
End Function

467
2017-10-08 22:56



En ASP.NET MVC (comenzando en la versión 3), puede agregar AllowHtml atribuir a una propiedad en su modelo.

Permite que una solicitud incluya marcado HTML durante el enlace del modelo omitiendo la validación de solicitud para la propiedad.

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

361
2017-09-05 09:33



Si está en .NET 4.0 asegúrese de agregar esto en su web.config archivo dentro del <system.web> etiquetas:

<httpRuntime requestValidationMode="2.0" />

En .NET 2.0, la validación de solicitud solo se aplica a aspx peticiones. En .NET 4.0 esto se amplió para incluir todas peticiones. Puedes volver a solamente realizar validación XSS al procesar .aspx especificando:

requestValidationMode="2.0"

Puede deshabilitar la solicitud de validación enteramente especificando:

validateRequest="false"

202
2017-07-30 04:51



Para ASP.NET 4.0, puede permitir el marcado como entrada para páginas específicas en lugar de todo el sitio al ponerlo todo en un <location> elemento. Esto asegurará que todas las otras páginas estén seguras. NO necesitas poner ValidateRequest="false" en tu página .aspx

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

Es más seguro controlar esto dentro de su web.config, porque puede ver a nivel del sitio qué páginas permiten el marcado como entrada.

Aún necesita validar la entrada de forma programática en las páginas donde la validación de solicitud está deshabilitada.


102
2017-11-27 17:22



Las respuestas anteriores son geniales, pero nadie dijo cómo excluir un solo campo de la validación de las inyecciones de HTML / JavaScript. No sé sobre versiones anteriores, pero en MVC3 Beta puedes hacer esto:

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
    ...
}

Esto aún valida todos los campos excepto el excluido. Lo bueno de esto es que sus atributos de validación todavía validan el campo, pero simplemente no obtiene las excepciones "Se detectó un valor de Request.Form potencialmente peligroso desde el cliente".

Lo he usado para validar una expresión regular. Creé mi ValidationAttribute para ver si la expresión regular es válida o no. Como las expresiones regulares pueden contener algo que se parece a un script, apliqué el código anterior: la expresión regular aún se verifica si es válida o no, pero no si contiene scripts o HTML.


68
2017-11-06 14:58



En ASP.NET MVC necesita establecer requestValidationMode = "2.0" y validateRequest = "false" en web.config, y aplicar un atributo ValidateInput a su acción de controlador:

<httpRuntime requestValidationMode="2.0"/>

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

y

[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
    ...
}

46
2017-11-30 12:56



Usted puede Codificación HTML contenido del cuadro de texto, pero desafortunadamente eso no impedirá que ocurra la excepción. Según mi experiencia, no hay forma de evitarlo, y debes desactivar la validación de la página. Al hacer eso, estás diciendo: "Tendré cuidado, lo prometo".


45
2017-09-17 11:20



Para MVC, ignore la validación de entrada agregando

[ValidateInput (falso)]

encima de cada acción en el controlador.


42
2018-01-29 09:40



Puede detectar ese error en Global.asax. Todavía quiero validar, pero mostrar un mensaje apropiado. En el blog que figura a continuación, una muestra como esta estaba disponible.

    void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        if (ex is HttpRequestValidationException)
        {
            Response.Clear();
            Response.StatusCode = 200;
            Response.Write(@"[html]");
            Response.End();
        }
    }

Redirigir a otra página también parece una respuesta razonable a la excepción.

http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html


41
2017-10-13 22:37



Tenga en cuenta que algunos controles .NET codificarán HTML automáticamente la salida. Por ejemplo, establecer la propiedad .Text en un control TextBox lo codificará automáticamente. Eso específicamente significa convertir <dentro &lt;, >dentro &gt; y &dentro &amp;. Así que ten cuidado de hacer esto ...

myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code

Sin embargo, la propiedad .Text para HyperLink, Literal y Label no codificará las cosas en HTML, por lo que envuelve Server.HtmlEncode (); todo lo que se establece en estas propiedades es imprescindible si desea evitar <script> window.location = "http://www.google.com"; </script> de ser enviado a su página y posteriormente ejecutado.

Haga un poco de experimentación para ver qué se codifica y qué no.


33
2017-09-17 14:40