Enrutamiento de URL, controlador de imagen y “Un valor de Request.Path potencialmente peligroso”

He estado experimentando este problema por bastante tiempo y he decidido tratar de llegar al fondo de una vez por todas publicando la pregunta aquí para reflexionar un poco. Tengo un manejador de imágenes en un sitio web .net 4 ubicado aquí:

https://www.amadeupurl.co.uk/ImageHandler.ashx?i=3604 (dominio real eliminado por privacidad)

Ahora esto funciona bien y sirve una imagen del servidor web sin problema, digo sin problema porque si accedo a la URL funciona bien, la imagen se carga, no se genera ninguna excepción. Sin embargo, alguien visitó esta URL exacta ayer y se generó una excepción en las siguientes líneas:

Exception Generated Error Message: A potentially dangerous Request.Path value was detected from the client (?). Stack Trace: at System.Web.HttpRequest.ValidateInputIfRequiredByConfig() at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context) Technical Information: DATE/TIME: 23/01/2013 03:50:01 PAGE: www.amadeupurl.co.uk/ImageHandler.ashx?i=3604 

Entiendo el mensaje de error, eso no es un problema, simplemente no entiendo por qué se genera aquí, para empeorar las cosas, no puedo replicarlo, como dije, hago clic en el enlace que carga la imagen, sin excepción. Estoy usando el enrutamiento de URL y registré el controlador que se debe ignorar en caso de que esto esté causando un problema con el siguiente código:

 routes.Ignore("{resource}.ashx") 

No estoy seguro de por qué más me daría el error o qué más probar.

Asp.Net 4.0+ viene con una validación de solicitud incorporada muy estricta, parte de ella son los caracteres peligrosos potenciales en la url que pueden usarse en ataques XSS. Aquí hay caracteres inválidos por defecto en la url:

<> * % & : \ ?

Puede cambiar este comportamiento en su archivo de configuración:

    

O regrese a la validación de .Net 2.0:

    

Un carácter inválido muy común es % , por lo que si por casualidad (ataque, rastreadores web, o simplemente un navegador no estándar) se está escapando la URL, obtienes esto:

 www.amadeupurl.co.uk/ImageHandler.ashx/%3Fi%3D3604 

en lugar de esto:

 www.amadeupurl.co.uk/ImageHandler.ashx/?i=3604 

Tenga en cuenta que %3F es el carácter de escape para ? . El carácter se considera inválido por el validador de solicitud Asp.Net y arroja una excepción:

 A potentially dangerous Request.Path value was detected from the client (?). 

Aunque en el mensaje de error, ¿ves la versión no escamada del personaje (% 3F) que es ? de nuevo

Aquí hay un buen artículo sobre Validación de solicitudes y cómo lidiar con él