J'ai une application ASP.NET MVC avec un itinéraire qui permet de rechercher des éléments via/search/<searchterm>.
Quand je fournis "search/abc" cela fonctionne bien, mais quand je fournis "/ search/a + b + c" (correctement encodé en URL), IIS7 refuse la requête avec l'erreur HTTP 404.11 (Le module de filtrage des requêtes est configuré pour refuser une demande contenant une séquence d'échappement double). Premièrement, pourquoi fait-il cela? Il semble que l'erreur ne soit renvoyée que si elle fait partie de l'URL, mais pas dans le cadre d'une chaîne de requête (/ émission? Q = a + b + c fonctionne bien).
Maintenant, je pouvais activer les demandes d'échappement double dans la section sécurité de mon web.config, mais j'hésite à le faire car je ne comprends pas les implications, et le serveur ne refuserait pas non plus la demande "a + b + c" fait partie de l'URL mais accepte comme partie d'une chaîne de requête.
Quelqu'un peut-il expliquer et donner des conseils sur ce qu'il faut faire?
Edit: Mise en évidence des sections pertinentes.
Fondamentalement: IIS est excessivement paranoïaque. Vous pouvez désactiver cette vérification en toute sécurité si vous ne faites rien de particulièrement imprudent avec les données décodées uri (telles que la génération d’URI de système de fichiers local via une concaténation de chaînes).
Pour désactiver la vérification, procédez comme suit (à partir de ici ): (voir mon commentaire ci-dessous pour savoir ce que signifie un double échappement).
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
</system.webServer>
Si le symbole plus est un caractère valide dans une entrée de recherche, vous need pour activer "allowDoubleEscaping" afin de permettre IIS = traiter une telle entrée depuis le chemin de l'URI.
Enfin, une solution très simple, si limitée, consiste simplement à éviter le "+" et à utiliser "% 20" à la place. Dans tous les cas, utiliser le symbole '+' pour coder un espace est pas codage d'URL valide , mais spécifique à un ensemble limité de protocoles et probablement largement pris en charge pour des raisons de compatibilité ascendante. Si seulement à des fins de canonisation, vous feriez mieux de coder des espaces en tant que '% 20'; et cela évite gentiment le problème IIS7 (qui peut toujours apparaître pour d'autres séquences, telles que% 25ab.)
Avez-vous pensé à avoir l'URL de recherche comme '/ search/a/b/c'?
Vous devez configurer un itinéraire comme
search/{*path}
Et puis extraire les valeurs de recherche de votre chaîne de chemin dans l'action.
HTH
Charles
Je voudrais juste ajouter des informations à réponse d'Eamon Nerbonne liées au " que faire "une partie de votre question (ne pas expliquer le pourquoi).
Vous pouvez facilement modifier les paramètres d’une application particulière avec
en tapant ce qui suit (tiré d'ici: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx ):
%windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true
(vous pouvez par exemple remplacer YOURSITENAME
par Default Web Site
pour appliquer cette règle au site Web par défaut)
Un exemple:
Je suis tombé sur cela sous IIS 7.5 en faisant un Server.TransferRequest () dans une application.
Le codage du nom de fichier a provoqué le problème de double-évasion, mais si je ne l’encodais pas, je rencontrerais l’erreur "Request.Path potentiellement dangereuse" .
Le fait de placer un protocole quelconque, même vide, sur l’URL que je passe à Server.TranferRequest () a résolu le problème.
Ne marche pas:
context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");
Travaux:
context.Server.TransferRequest("://folder/bar%20bar.jpg");