web-dev-qa-db-fra.com

L'activation de la double sortie est-elle dangereuse?

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?

130
Alex

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.)

152
Eamon Nerbonne

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

2
Charlino

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

  1. ouverture de la console avec des droits d'administrateur (Démarrer - cmd - clic droit, Exécuter en tant qu'administrateur)
  2. 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)

  3. Entrez, prêt.

Un exemple:

  1. tout d'abord j'ai eu le même problème: HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.
  2. En tapant dans le texte mentionné ci-dessus: Drupal7-anotherSolution to HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.
  3. Maintenant, cela fonctionne comme prévu: Solution to HTTP Error 404.11 - The request filtering module is configured to deny a request that contains a double escape sequence.
2
Sk8erPeter

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");
0
mhenry1384