Estou procurando qualquer tipo de solução para obter corretamente uma solicitação do IIS, como /programming//% e http://bing.com/%, para não exibir uma página 400 Solicitação incorreta, mas exibir uma página de erro personalizada semelhante à maneira como o http://google.com/% e http://facebook.com/% faz (obviamente, esses exemplos não estão no IIS).
Acredito que tentei definir todas as configurações de registro http.sys aplicáveis (AllowRestrictedChars, PercentUAllowed) por http://support.microsoft.com/kb/820129, mas isso não ajudou. A configuração de AllowRestrictedChars e uma página 400 personalizada corrigiu URLs como /programming//%12, mas não /%.
Respostas:
Isso está bloqueado diretamente no nível do kernel do IIS. Como teste, retirei todos os módulos do IIS para que ele nem tivesse um manipulador de página estático e ainda exibisse a mensagem de erro 400.
Não acredito que seja possível com o IIS contornar isso. As configurações do registro mencionadas são para outros tipos de caracteres restritos. Não vi uma alavanca para alterar essa funcionalidade.
Qual é o seu objetivo é evitar isso? Ele abre sua superfície de ataque mais ampla e não consigo imaginar um visitante legítimo sendo perdido como resultado do bloqueio de seqüências de escape de URL incompletas.
Update2: Aqui estão três ótimos links sobre isso. Nazim Lala e Wade Hilmo da equipe do IIS publicaram um blog sobre isso por causa de discussões sobre sua pergunta. Scott Hanselman também tem um ótimo post sobre a parte da querystring no .NET:
Atualização: verifiquei com um membro da equipe do IIS para obter uma resposta autorizada. Ele mencionou que o% é considerado um caractere não seguro de acordo com a RFC 1738 ( http://www.ietf.org/rfc/rfc1738.txt ).
Aqui está o texto relevante:
Portanto, o IIS proativamente bloqueia isso no nível principal, uma medida de segurança proativa para minimizar a superfície de ataque.
fonte
Eu posso pensar em 3 maneiras possíveis
Altere o IIS para apontar para uma página personalizada para 400 erros do que normalmente
Se isso é exclusivo para um site específico no IIS, você pode fazer algo assim no web.config:
<customErrors defaultRedirect = "ErrorPage.aspx" mode = "On">
<error statusCode = "400" redirect = "myCustom400Error.aspx" />
</customErrors>
Escreva um httpModule que inspeciona os URLs recebidos e os manipula
fonte
A única maneira de contornar isso parece verificar a URL antes que o kernel do IIS possa.
Você precisaria enviar os links gerados dinamicamente por meio de um script para verificá-los antes de encaminhar o usuário final para esse URL ...
Salvo isso, você sabe que esta é a única situação em que o IIS não lidará com isso da maneira que você deseja. Portanto, pelo processo de eliminação, se você tiver uma solicitação não tratada, sabe o que a causou.
Talvez a verificação do referenciador em uma página personalizada de 400 ajude a restringir a origem do tráfego?
fonte
Esta postagem no fórum do IIS indica que o HTTP 400 (Solicitação inválida) está bloqueado pelo http.sys e não chega ao IIS, que corresponde aos links que o @Scott Forsyth - MVP incluiu em sua resposta original.
Você pode ver um log dessas solicitações em c: \ Windows \ System32 \ LogFiles \ HTTPERR \
Não sei se você pode configurar a página de resposta que é enviada de volta ao usuário para esse tipo de erro, mas como até o Bing sofre com esse problema, suspeito que isso não é possível ou exigiria alguns hacks horríveis no sistema.
fonte