Je recherche tout type de solution pour obtenir correctement une demande IIS telle que /programming//% et http://bing.com/% pour ne pas afficher une page 400 Bad Request, mais afficher une page d'erreur personnalisée similaire à la façon dont http://google.com/% et http://facebook.com/% font (évidemment ces exemples ne sont pas sur IIS).
Je crois que j'ai essayé de définir tous les paramètres de registre http.sys applicables (AllowRestrictedChars, PercentUAllowed) par http://support.microsoft.com/kb/820129 mais cela n'a pas aidé. La définition de AllowRestrictedChars et d'une page 400 personnalisée a des URL fixes telles que /programming//%12 mais pas /%.
Réponses:
Ceci est bloqué directement au niveau du noyau IIS. En tant que test, j'ai retiré chaque module dans IIS afin qu'il n'ait même pas de gestionnaire de page statique et qu'il affiche toujours le message d'erreur 400.
Je ne pense pas qu'il soit possible avec IIS de contourner cela. Les paramètres de registre que vous avez mentionnés concernent d'autres types de caractères restreints. Je n'ai pas vu de levier pour changer cette fonctionnalité.
Quel est votre objectif d'éviter cela? Cela ouvre votre surface d'attaque plus large, et je ne peux pas imaginer qu'un visiteur légitime soit perdu à la suite du blocage de séquences d'échappement URL incomplètes.
Update2: Voici trois excellents liens à ce sujet. Nazim Lala et Wade Hilmo de l'équipe IIS ont blogué à ce sujet en raison de la discussion autour de votre question. Scott Hanselman a également un excellent article sur la partie chaîne de requête dans .NET:
Mise à jour: j'ai vérifié auprès d'un membre de l'équipe IIS pour obtenir une réponse faisant autorité. Il a mentionné que le% est considéré comme un caractère dangereux selon RFC 1738 ( http://www.ietf.org/rfc/rfc1738.txt ).
Voici le texte pertinent:
IIS bloque donc de manière proactive ce problème au niveau principal, une mesure de sécurité proactive pour minimiser leur surface d'attaque.
la source
Je peux penser à 3 façons possibles
Modifier IIS pour pointer vers une page personnalisée pour 400 erreurs par rapport à la normale
Si cela est unique à un site Web spécifique dans IIS, vous pouvez faire quelque chose comme ça dans le web.config:
<customErrors defaultRedirect = "ErrorPage.aspx" mode = "On">
<error statusCode = "400" redirect = "myCustom400Error.aspx" />
</customErrors>
Écrivez un httpModule qui inspecte les URL entrantes et les gère
la source
La seule solution consiste à vérifier l'URL avant que le noyau IIS ne le puisse.
Vous devez envoyer vos liens générés dynamiquement via un script pour les vérifier avant de transférer votre utilisateur final vers cette URL ...
En dehors de cela, vous savez que c'est la seule situation où IIS ne le traitera pas comme vous le souhaitez. Donc, par processus d'élimination, si vous avez une demande non traitée, vous savez ce qui l'a provoquée.
Peut-être que la vérification du référent dans une page 400 personnalisée aiderait à réduire la source du trafic?
la source
Ce message sur le forum IIS indique que HTTP 400 (Bad Request) est bloqué par http.sys et ne parvient pas à IIS qui correspond aux liens que @Scott Forsyth - MVP a inclus dans sa réponse d'origine.
Vous pouvez voir un journal de ces demandes sous c: \ Windows \ System32 \ LogFiles \ HTTPERR \
Je ne sais pas si vous pouvez configurer la page de réponse qui est renvoyée à l'utilisateur pour ce type d'erreur, mais puisque même Bing souffre de ce problème, je soupçonne que ce n'est pas possible ou nécessiterait des horribles hacks système.
la source