Tengo una aplicación ASP.NET MVC con una ruta que permite buscar cosas a través de / search / <searchterm>.
Cuando proporciono "search / abc" funciona bien, pero cuando proporciono "/ search / a + b + c" (codificado correctamente en URL), IIS7 rechaza la solicitud con el error HTTP 404.11 ( el módulo de filtrado de solicitudes está configurado para denegar un solicitud que contiene una secuencia de escape doble ). En primer lugar, ¿por qué hace esto? Solo parece arrojar el error si es parte de la URL, pero no como parte de una cadena de consulta (/ transmit? Q = a + b + c funciona bien).
Ahora podría habilitar las solicitudes de doble escape en la sección de seguridad de mi web.config, pero dudo en hacerlo, ya que no entiendo las implicaciones, y tampoco por qué el servidor rechazaría la solicitud "a + b + c" como parte de la URL pero aceptar como parte de una cadena de consulta.
¿Alguien puede explicar y dar algún consejo qué hacer?
fuente
/search/a%2520b%2520c
el marcado que condujo a un error encantador "Se detectó un valor Request.Path potencialmente peligroso del cliente (%)". No puedes ganar parece.Respuestas:
Editar: Se agregó énfasis a las secciones relevantes.
Básicamente: IIS está siendo excesivamente paranoico. Puede deshabilitar esta verificación de forma segura si no está haciendo nada particularmente imprudente con los datos decodificados uri (como generar URI del sistema de archivos local a través de la concatenación de cadenas).
Para deshabilitar la verificación, haga lo siguiente (desde aquí ): (vea mi comentario a continuación para saber qué implica el doble escape).
Si el símbolo de suma es un carácter válido en una entrada de búsqueda, usted necesita para permitir "allowDoubleEscaping" para permitir IIS para procesar dicha entrada del camino de la URI.
Finalmente, una solución muy simple, aunque limitada, es simplemente evitar '+' y usar '% 20' en su lugar. En cualquier caso, usar el símbolo '+' para codificar un espacio no es una codificación de URL válida , sino que es específica de un conjunto limitado de protocolos y probablemente sea ampliamente compatible por razones de compatibilidad con versiones anteriores. Aunque solo sea para fines de canonicalización, es mejor codificar espacios como '% 20' de todos modos; y esto evita el problema de IIS7 (que aún puede surgir para otras secuencias, como% 25ab).
fuente
Solo me gustaría agregar información a la respuesta de Eamon Nerbonne relacionada con la parte " qué hacer " de su pregunta (sin explicar los porqués).
También puede cambiar fácilmente la configuración de una aplicación en particular con
escribiendo lo siguiente (tomado de aquí: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx ):
(por ejemplo, se puede sustituir
YOURSITENAME
conDefault Web Site
para aplicar esta regla a la página web por defecto)Un ejemplo:
fuente
¿Has pensado en tener la URL de búsqueda como '/ search / a / b / c'?
Tendría que configurar una ruta como
Y luego extraiga los valores de búsqueda de su cadena de ruta en la acción.
HTHs
Charles
fuente
Me encontré con esto en IIS 7.5 haciendo un Server.TransferRequest () en una aplicación.
Codificar el nombre del archivo causó el problema de doble escape, pero si no lo codifico, me encontraría con el error "Solicitud de ruta potencialmente peligrosa" .
Al poner un protocolo cualquiera, incluso uno vacío, en la URL que paso al Servidor.TranferRequest () solucionó el problema.
No funciona:
Trabajos:
fuente