remarks generate example escape c# asp.net-mvc iis-7

c# - generate - regex escape



¿Es peligroso permitir el doble escape? (4)

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" (correctamente url codificado), entonces IIS7 rechaza la solicitud con HTTP Error 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 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 acepte como parte de una cadena de consulta.

¿Alguien puede explicar y dar algunos consejos sobre qué hacer?


¿Has pensado en tener la URL de búsqueda como ''/ search / a / b / c''?

Tendría que configurar una ruta como

search/{*path}

Y luego extraiga los valores de búsqueda de su cadena de ruta en la acción.

HTH
Charles


Me encontré con esto bajo IIS 7.5 haciendo un Server.TransferRequest () en una aplicación.

La codificación del nombre de archivo causó el problema del doble escape, pero si no lo codificaba, me encontraba con el error "potencialmente peligroso Request.Path" .

Poner un protocolo, incluso uno vacío, en la URL que paso a Server.TranferRequest () solucionó el problema.

No funciona:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

Trabajos:

context.Server.TransferRequest("://folder/bar%20bar.jpg");


Me gustaría agregar algo de información a la respuesta de Eamon Nerbonne relacionada con la parte " qué hacer " de su pregunta (sin explicar los por qué).
También puede cambiar fácilmente la configuración de una aplicación en particular con

  1. abrir la consola con derechos de administrador (Inicio - cmd - clic con el botón derecho, Ejecutar como administrador)
  2. escribiendo a continuación (tomado de aquí: blogs.iis.net/thomad/archive/2007/12/17/… ):

    %windir%/system32/inetsrv/appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true

    (puede, por ejemplo, sustituir YOURSITENAME con el Default Web Site para aplicar esta regla al sitio web predeterminado)

  3. Entra, listo.

Un ejemplo:

  1. primero tuve el mismo problema:
  2. Escribiendo el texto mencionado arriba:
  3. Ahora funciona como se esperaba:

Editar: énfasis añadido a las secciones relevantes.

Básicamente: IIS está siendo excesivamente paranoico. Puede desactivar esta comprobación de manera segura si no está haciendo nada especialmente imprudente con los datos decodificados de uri (como generar URI de sistema de archivos local mediante concatenación de cadenas).

Para deshabilitar el cheque, haga lo siguiente (desde here ): (vea mi comentario a continuación sobre qué implica el doble escape).

<system.webServer> <security> <requestFiltering allowDoubleEscaping="true"/> </security> </system.webServer>

Si el símbolo más es un carácter válido en una entrada de búsqueda, deberá habilitar "allowDoubleEscaping" para permitir que IIS procese dicha entrada desde la ruta del URI.

Finalmente, una solución muy simple, aunque limitada, es simplemente evitar ''+'' y usar ''% 20''. En cualquier caso, usar el símbolo ''+'' para codificar un espacio no es una codificación de URL válida , sino específica para un conjunto limitado de protocolos y probablemente sea ampliamente compatible por razones de compatibilidad con versiones anteriores. Si solo para fines de canonización, es mejor que codifique espacios como ''% 20'' de todos modos; y esto deja de lado el problema de IIS7 (que aún puede aparecer en otras secuencias, como% 25ab).