J'ai une application ASP.NET MVC avec une route 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 url encodé) alors IIS7 rejette la demande avec l'erreur HTTP 404.11 ( Le module de filtrage des demandes est configuré pour refuser un requête contenant une double séquence d'échappement ). Premièrement, pourquoi fait-il cela? Il ne semble lancer l'erreur que si elle fait partie de l'URL, mais pas dans le cadre d'une chaîne de requête (/ transmettre? Q = a + b + c fonctionne bien).
Maintenant, je pourrais activer les demandes de double échappement dans la section de sécurité de mon web.config mais j'hésite à le faire car je ne comprends pas les implications, ni pourquoi le serveur rejetterait la demande "a + b + c" comme partie de l'URL mais accepter comme partie d'une chaîne de requête.
Quelqu'un peut-il expliquer et donner des conseils sur ce qu'il faut faire?
la source
/search/a%2520b%2520c
le balisage qui a conduit à une belle erreur "Une valeur Request.Path potentiellement dangereuse a été détectée par le client (%)". Vous ne pouvez pas gagner semble-t-il.Réponses:
Éditer: 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 par uri (comme la génération d'URI du système de fichiers local via la concaténation de chaînes).
Pour désactiver la vérification, procédez comme suit (à partir d' ici ): (voir mon commentaire ci-dessous pour savoir ce qu'implique le double échappement).
Si le symbole plus est un caractère valide dans une entrée de recherche, vous devrez activer «allowDoubleEscaping» pour permettre à IIS de traiter une telle entrée à partir du chemin de l'URI.
Enfin, une solution de contournement très simple, bien que limitée, consiste simplement à éviter «+» et à utiliser «% 20» à la place. Dans tous les cas, l'utilisation du symbole «+» pour coder un espace n'est pas un codage d'URL valide , mais spécifique à un ensemble limité de protocoles et probablement largement pris en charge pour des raisons de rétrocompatibilité. Ne serait-ce qu'à des fins de canonisation, il est préférable d'encoder les espaces en tant que «% 20» de toute façon; et cela évite bien le problème IIS7 (qui peut encore surgir pour d'autres séquences, telles que% 25ab.)
la source
Je voudrais juste ajouter quelques informations à la réponse d'Eamon Nerbonne concernant la partie « que faire » de votre question (sans expliquer pourquoi).
Vous pouvez également modifier facilement 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 ):
(vous pouvez par exemple remplacer
YOURSITENAME
parDefault Web Site
pour appliquer cette règle au site Web par défaut)Un exemple:
la source
Avez-vous pensé à avoir l'URL de recherche comme «/ search / a / b / c»?
Vous auriez besoin de configurer un itinéraire comme
Et puis extrayez les valeurs de recherche de votre chaîne de chemin dans l'action.
HTHs
Charles
la source
J'ai rencontré cela sous IIS 7.5 en effectuant un Server.TransferRequest () dans une application.
L'encodage du nom de fichier a provoqué le problème de double échappement, mais si je ne l'ai pas encodé, je me heurterais à l' erreur "Request.Path potentiellement dangereux" .
Mettre un protocole quelconque, même vide, sur l'URL que je passe à Server.TranferRequest () a résolu le problème.
Ne marche pas:
Travaux:
la source