Estoy buscando cualquier tipo de solución para obtener correctamente una solicitud de IIS como /programming//% y http://bing.com/% para no mostrar una página 400 Bad Request, pero mostrar una página de error personalizada similar a como http://google.com/% y http://facebook.com/% lo hacen (obviamente, esos ejemplos no están en IIS).
Creo que he intentado establecer todas las configuraciones de registro http.sys aplicables (AllowRestrictedChars, PercentUAllowed) según http://support.microsoft.com/kb/820129 pero eso no ha ayudado. La configuración de AllowRestrictedChars y una página 400 personalizada tiene URL fijas como /programming//%12 pero no /%.
Respuestas:
Esto está bloqueado justo en el nivel del kernel IIS. Como prueba, saqué todos los módulos en IIS para que ni siquiera tuviera un controlador de página estático, y todavía mostraba el mensaje de error 400.
No creo que sea posible con IIS evitar eso. La configuración de registro que mencionó es para otros tipos de caracteres restringidos. No he visto una palanca para cambiar esa funcionalidad.
¿Cuál es tu objetivo es evitar eso? Abre más la superficie de ataque, y no puedo imaginar que un visitante legítimo se pierda como resultado de bloquear secuencias de escape de URL incompletas.
Actualización2: Aquí hay tres excelentes enlaces sobre esto. Tanto Nazim Lala como Wade Hilmo del equipo de IIS han blogueado sobre esto debido a la discusión sobre su pregunta. También Scott Hanselman tiene una excelente publicación sobre la parte de la cadena de consulta dentro de .NET:
Actualización: Verifiqué con un miembro del equipo de IIS para obtener una respuesta autorizada. Mencionó que el% se considera un carácter inseguro según RFC 1738 ( http://www.ietf.org/rfc/rfc1738.txt ).
Aquí está el texto relevante:
Entonces, IIS bloquea esto proactivamente en el nivel central, una medida de seguridad proactiva para minimizar su superficie de ataque.
fuente
Puedo pensar en 3 formas posibles
Cambie IIS para que apunte a una página personalizada por 400 errores de lo que normalmente hace
Si esto es exclusivo de un sitio web específico en IIS, puede hacer algo como esto en web.config:
<customErrors defaultRedirect = "ErrorPage.aspx" mode = "On">
<error statusCode = "400" redirect = "myCustom400Error.aspx" />
</customErrors>
Escriba un httpModule que inspeccione las URL entrantes y las maneje
fuente
La única forma de evitar esto suena como verificar la URL antes de que el kernel de IIS pueda.
Debería enviar sus enlaces generados dinámicamente a través de un script para verificarlos antes de reenviar a su usuario final a esa URL ...
Salvo eso, usted sabe que esta es la única situación en la que IIS no lo manejará de la manera que desee. Entonces, por proceso de eliminación, si tiene una solicitud no manejada, sabe qué la causó.
¿Quizás verificar la referencia en una página 400 personalizada ayudaría a reducir la fuente del tráfico?
fuente
Esta publicación en el foro de IIS indica que HTTP 400 (Solicitud incorrecta) está bloqueada por http.sys y no llega a IIS, que coincide con los enlaces que @Scott Forsyth - MVP incluyó en su respuesta original.
Puede ver un registro de estas solicitudes en c: \ Windows \ System32 \ LogFiles \ HTTPERR \
No sé si puede configurar la página de respuesta que se envía al usuario para este tipo de error, pero dado que incluso Bing sufre de este problema, sospecho que eso no es posible o requeriría algunos ataques horribles del sistema.
fuente