Cada vez que un usuario publica algo que contiene <
o está >
en una página de mi aplicación web, recibo 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, regrese y vuelva a escribir todo el formulario nuevamente, pero esta vez no use <
No me parece lo suficientemente profesional.
Deshabilitar la validación posterior ( 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 restringidos en HTML, 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?
<httpRuntime requestValidationMode="2.0" />
en web.configRespuestas:
Creo que lo estás atacando desde el ángulo equivocado al tratar de 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 inherentemente peligroso. Solo es peligroso en un contexto específico: al escribir cadenas que no se han codificado en la salida 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 peligrosa. El carácter de comillas simples, 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 puede filtrar la entrada aleatoria de caracteres peligrosos, porque cualquier carácter puede ser peligroso en las circunstancias correctas. Debe codificar en el punto donde algunos caracteres específicos pueden volverse peligrosos porque se cruzan a un sub-idioma diferente donde tienen un significado especial. Cuando escribe una cadena en HTML, debe codificar caracteres que tengan un significado especial en HTML, utilizando Server.HtmlEncode. Si pasa una cadena a una declaración SQL dinámica, debe codificar diferentes caracteres (o mejor, deje que el marco lo haga por usted usando declaraciones preparadas o similares).
Cuando esté seguro de que codifica HTML en todas partes donde pasa cadenas a HTML, luego establezca
validateRequest="false"
la<%@ Page ... %>
directiva en su.aspx
(s) archivo (s).En .NET 4 puede que tenga que hacer un poco más. A veces es necesario agregar también
<httpRuntime requestValidationMode="2.0" />
a web.config ( referencia ).fuente
<httpRuntime requestValidationMode="2.0" />
una etiqueta de ubicación para evitar matar la útil protección proporcionada por la validación del resto de su sitio.[AllowHtml]
en la propiedad del modelo.GlobalFilters.Filters.Add(new ValidateInputAttribute(false));
enApplication_Start()
.<pages validateRequest="false" />
in<system.web />
. Al hacerlo, se aplicará la propiedad a todas las páginas.Hay una solución diferente a este error si está utilizando ASP.NET MVC:
Muestra de C #:
Muestra de Visual Basic:
fuente
[AllowHtml]
es mejor queValidateInput(false)
, porque[AllowHtml]
se define a la vez para una propiedad, es decir, el campo Editor y cada vez que se usa no hay necesidad de usarlo para varias acciones. ¿Que sugieres?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 un marcado HTML durante el enlace del modelo omitiendo la validación de solicitud para la propiedad.
fuente
ValidateInput(false)
yAllowHtml
? ¿Cuál es la ventaja de uno sobre el otro? ¿Cuándo me gustaría usar enAllowHtml
lugar deValidateInput(false)
? ¿Cuándo me gustaría usarValidateInput(false)
másAllowHtml
? ¿Cuándo querría usar ambos? ¿Tiene sentido usar ambos?Si está en .NET 4.0, asegúrese de agregar esto en su archivo web.config dentro de las
<system.web>
etiquetas:En .NET 2.0, la validación de solicitud solo se aplica a las
aspx
solicitudes. En .NET 4.0 esto se expandió para incluir todas las solicitudes. Puede volver a realizar solo la validación XSS al procesar.aspx
especificando:Puede deshabilitar la validación completa de la solicitud especificando:
fuente
<system.web>
etiquetas.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 tus otras páginas estén seguras. NO necesita ponerValidateRequest="false"
en su página .aspx.Es más seguro controlar esto dentro de su web.config, porque puede ver a nivel de sitio qué páginas permiten el marcado como entrada.
Aún necesita validar mediante programación la entrada en páginas donde la validación de solicitud está deshabilitada.
fuente
Las respuestas anteriores son geniales, pero nadie dijo cómo excluir un solo campo de ser validado para inyecciones HTML / JavaScript. No sé sobre versiones anteriores, pero en MVC3 Beta puedes hacer esto:
Esto todavía valida todos los campos excepto el excluido. Lo bueno de esto es que sus atributos de validación aún validan el campo, pero simplemente no obtiene las excepciones "Se detectó un valor de Solicitud potencialmente peligroso.
Lo he usado para validar una expresión regular. He creado mi propio 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 todavía se está verificando si es válida o no, pero no si contiene scripts o HTML.
fuente
[AllowHtml]
en las propiedades del modelo en lugar de[ValidateInput]
en la Acción para lograr el mismo resultado final.[AllowHtml]
no es una opción. Recomiendo revisar este artículo: weblogs.asp.net/imranbaloch/… , pero también es algo antiguo y puede estar desactualizado.En ASP.NET MVC, debe establecer requestValidationMode = "2.0" y validateRequest = "false" en web.config, y aplicar un atributo ValidateInput a la acción de su controlador:
y
fuente
validateRequest="false"
no era necesario, solorequestValidationMode="2.0"
Puede codificar HTML en el contenido del cuadro de texto, pero desafortunadamente eso no detendrá la excepción. En mi experiencia, no hay forma de evitarlo, y debe deshabilitar la validación de la página. Al hacerlo, estás diciendo: "Tendré cuidado, lo prometo".
fuente
Para MVC, ignore la validación de entrada agregando
sobre cada acción en el controlador.
fuente
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.
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
fuente
La respuesta a esta pregunta es simple:
Esto deshabilitaría la validación para la solicitud particular.
fuente
Request
?Tenga en cuenta que algunos controles .NET codificarán automáticamente la salida HTML. Por ejemplo, establecer la propiedad .Text en un control TextBox la codificará automáticamente. Eso significa específicamente convertir
<
en<
,>
en>
y&
en&
. Así que ten cuidado de hacer esto ...Sin embargo, la propiedad .Text para HyperLink, Literal y Label no codificará HTML, por lo que envolverá Server.HtmlEncode (); todo lo que se establece en estas propiedades es imprescindible si desea evitar que
<script> window.location = "http://www.google.com"; </script>
se imprima en su página y se ejecute posteriormente.Experimente un poco para ver qué se codifica y qué no.
fuente
En el archivo web.config, dentro de las etiquetas, inserte el elemento httpRuntime con el atributo requestValidationMode = "2.0". Agregue también el atributo validateRequest = "false" en el elemento de páginas.
Ejemplo:
fuente
Si no desea deshabilitar ValidateRequest, debe implementar una función de JavaScript para evitar la excepción. No es la mejor opción, pero funciona.
Luego, en el código detrás, en el evento PageLoad, agregue el atributo a su control con el siguiente código:
fuente
Parece que nadie ha mencionado lo siguiente todavía, pero me soluciona el problema. Y antes de que alguien diga que sí, es Visual Basic ... qué asco.
No sé si hay inconvenientes, pero para mí esto funcionó increíble.
fuente
Otra solución es:
fuente
Si está utilizando Framework 4.0, la entrada en web.config (<páginas validateRequest = "false" />)
Si está utilizando Framework 4.5, entonces la entrada en web.config (requestValidationMode = "2.0")
Si solo desea una sola página, en su archivo aspx debe poner la primera línea como esta:
si ya tiene algo como <% @ Page, simplemente agregue el resto =>
EnableEventValidation="false"
%>Recomiendo no hacerlo.
fuente
En ASP.NET, puede detectar la excepción y hacer algo al respecto, como mostrar un mensaje amigable o redirigir a otra página ... También existe la posibilidad de que pueda manejar la validación usted mismo ...
Mostrar mensaje amigable:
fuente
Supongo que podrías hacerlo en un módulo; pero eso deja abiertas algunas preguntas; ¿Qué pasa si desea guardar la entrada en una base de datos? De repente, debido a que está guardando datos codificados en la base de datos, termina confiando en la entrada, lo que probablemente sea una mala idea. Lo ideal es que almacene datos sin codificar sin procesar en la base de datos y la codificación cada vez.
Deshabilitar la protección en un nivel por página y luego codificar cada vez es una mejor opción.
En lugar de usar Server.HtmlEncode, debería mirar la biblioteca Anti-XSS más nueva y más completa del equipo de Microsoft ACE.
fuente
Porque
ASP.NET por defecto valida todos los controles de entrada para contenido potencialmente inseguro que puede conducir a secuencias de comandos entre sitios (XSS) e inyecciones SQL . Por lo tanto, no permite dicho contenido lanzando la excepción anterior. Por defecto, se recomienda permitir que esta verificación se realice en cada devolución de datos.
Solución
En muchas ocasiones, debe enviar contenido HTML a su página a través de Rich TextBoxes o Rich Text Editors. En ese caso, puede evitar esta excepción estableciendo la etiqueta ValidateRequest en la
@Page
directiva en false.Esto deshabilitará la validación de solicitudes para la página en la que ha establecido el indicador ValidateRequest en falso. Si desea desactivar esto, verifique en toda su aplicación web; deberá configurarlo como falso en su sección web.config <system.web>
Para marcos .NET 4.0 o superior, también deberá agregar la siguiente línea en la sección <system.web> para que funcione lo anterior.
Eso es. Espero que esto te ayude a deshacerte del problema anterior.
Referencia por: ASP.Net Error: Se detectó un valor de Request.Form potencialmente peligroso desde el cliente
fuente
Encontré una solución que usa JavaScript para codificar los datos, que se decodifica en .NET (y no requiere jQuery).
Agregue la siguiente función de JavaScript a su encabezado.
función boo () {targetText = document.getElementById ("HiddenField1"); sourceText = document.getElementById ("userbox"); targetText.value = escape (sourceText.innerText); }En su área de texto, incluya un onchange que llame a boo ():
Finalmente, en .NET, use
Soy consciente de que esto es unidireccional: si necesita dos vías, tendrá que ser creativo, pero esto proporciona una solución si no puede editar la web.config
Aquí hay un ejemplo que se me ocurrió (MC9000) y uso a través de jQuery:
Y el marcado:
Esto funciona muy bien. Si un pirata informático intenta publicar sin saltarse JavaScript, solo verá el error. También puede guardar todos estos datos codificados en una base de datos, luego dejarlos de lado (en el lado del servidor) y analizar y verificar si hay ataques antes de mostrarlos en otro lugar.
fuente
escape(...)
puede tomar mucho tiempo En mi caso, el marcado era un archivo XML completo (2 MB). Usted puede preguntar: "¿Por qué no solo usas<input type="file"...
y ... estoy de acuerdo contigo? :)Las otras soluciones aquí son buenas, sin embargo, es un poco difícil en la parte trasera tener que aplicar [AllowHtml] a cada propiedad de Modelo, especialmente si tiene más de 100 modelos en un sitio de tamaño decente.
Si, como yo, desea desactivar esta función (en mi humilde opinión, bastante inútil) en todo el sitio, puede anular el método Execute () en su controlador base (si aún no tiene un controlador base, le sugiero que cree uno, pueden ser bastante útil para aplicar funcionalidad común).
Solo asegúrese de que está codificando HTML todo lo que se bombea a las vistas que provienen de la entrada del usuario (de todos modos, es un comportamiento predeterminado en ASP.NET MVC 3 con Razor, por lo que a menos que por alguna extraña razón esté usando Html.Raw () usted No debería requerir esta función.
fuente
También recibí este error.
En mi caso, un usuario ingresó un carácter acentuado
á
en un Nombre de rol (con respecto al proveedor de membresía ASP.NET).Paso el nombre del rol a un método para otorgar a los Usuarios a ese rol y la
$.ajax
solicitud de publicación fallaba miserablemente ...Hice esto para resolver el problema:
En vez de
Hacer esto
@Html.Raw
Hizo el truco.Estaba obteniendo el nombre del rol como valor HTML
roleName="Cadastro bás"
.á
ASP.NET MVC estaba bloqueando este valor con la entidad HTML . Ahora obtengo elroleName
valor del parámetro como debería ser:roleName="Cadastro Básico"
y el motor ASP.NET MVC ya no bloqueará la solicitud.fuente
Desactivar la validación de la página si realmente necesita los caracteres especiales como,
>
,,<
, etc A continuación, asegúrese de que cuando se muestra la entrada del usuario, los datos son codificados en HTML.Existe una vulnerabilidad de seguridad con la validación de la página, por lo que se puede omitir. Además, no se debe confiar únicamente en la validación de la página.
Ver: http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf
fuente
También puede usar la función de escape (cadena) de JavaScript para reemplazar los caracteres especiales. Luego, del lado del servidor, use el servidor. URLDecode (cadena) para volver a cambiarlo.
De esta manera, no tiene que desactivar la validación de entrada y será más claro para otros programadores que la cadena puede tener contenido HTML.
fuente
Terminé usando JavaScript antes de cada devolución de datos para verificar los caracteres que no deseaba, como:
De acuerdo, mi página es principalmente entrada de datos, y hay muy pocos elementos que realicen devoluciones, pero al menos se conservan sus datos.
fuente
Puedes usar algo como:
Más tarde,
nvc["yourKey"]
debería funcionar.fuente
Siempre que estos sean solo caracteres "<" y ">" (y no la comilla doble) y los esté utilizando en contexto como <input value = " this " />, estará a salvo (mientras que para <textarea > este </textarea> sería vulnerable, por supuesto). Eso puede simplificar su situación, pero para cualquier otra cosa use una de las otras soluciones publicadas.
fuente
Si solo desea decirles a sus usuarios que <y> no se deben usar PERO, no desea que se procese / regrese todo el formulario (y pierda toda la información) de antemano, ¿no podría simplemente ingresar un validador alrededor del campo para detectar esos (y tal vez otros personajes potencialmente peligrosos)?
fuente
Ninguna de las sugerencias funcionó para mí. De todos modos, no quería desactivar esta función para todo el sitio web porque el 99% del tiempo no quiero que mis usuarios coloquen HTML en formularios web. Acabo de crear mi propio método de trabajo ya que soy el único que usa esta aplicación en particular. Convierto la entrada a HTML en el código detrás y la inserto en mi base de datos.
fuente