139 votes

L'activation du double échappement est-elle dangereuse ?

J'ai une application ASP.NET MVC avec une route qui permet de rechercher des choses via /search/<searchterm>.

Lorsque je fournis "search/abc", cela fonctionne bien, mais lorsque je fournis "/search/a+b+c" (correctement codé en url), IIS7 rejette la requête avec l'erreur HTTP 404.11 ( Le module de filtrage des demandes est configuré pour refuser une demande qui contient une double séquence d'échappement. ). Tout d'abord, pourquoi fait-il cela ? L'erreur ne semble se produire que si le mot fait partie de l'URL, mais pas d'une chaîne de requête (/transmit?q=a+b+c fonctionne bien).

Je pourrais activer les requêtes à double échappement dans la section 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 requête "a+b+c" comme partie de l'URL mais l'accepterait comme partie d'une chaîne de requête.

Quelqu'un peut-il m'expliquer et me conseiller sur la marche à suivre ?

7 votes

J'ai également essayé l'option peut-être plus correcte d'appeler Server.Url. Chemin d'accès Encode et se retrouve avec /search/a%2520b%2520c dans le balisage qui a conduit à une belle erreur "Une valeur potentiellement dangereuse de Request.Path a été détectée à partir du client (%)". Il semble que l'on ne puisse pas gagner.

165voto

Eamon Nerbonne Points 21663

Edit: Mise en évidence des sections pertinentes.

En gros : IIS est excessivement paranoïaque. Vous pouvez désactiver cette vérification sans risque si vous ne faites rien de particulièrement imprudent avec les données décodées de l'uri (comme la génération d'URI de systèmes de fichiers locaux par concaténation de chaînes).

Pour désactiver la vérification, procédez comme suit (à partir de aquí ) : (voir mon commentaire ci-dessous pour savoir ce qu'implique le 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 pourrez besoin de pour activer "allowDoubleEscaping" afin de permettre à IIS de traiter une telle entrée à partir du chemin de l'URI.

Enfin, une solution très simple, quoique limitée, consiste simplement à éviter le signe "+" et à utiliser "%20" à la place. Dans tous les cas, l'utilisation du symbole '+' pour encoder un espace est no encodage url valide mais spécifique à un ensemble limité de protocoles et probablement largement pris en charge pour des raisons de rétrocompatibilité. Si ce n'est qu'à des fins de canonisation, il est préférable d'encoder les espaces en tant que "%20" de toute façon ; et cela permet d'éviter le problème d'IIS7 (qui peut toujours se produire pour d'autres séquences, telles que %25ab).

3 votes

Je désactiverais le contrôle. C'est une corvée et cela n'apporte pas de sécurité supplémentaire à la plupart des applications.

3 votes

Avez-vous un lien/une référence indiquant que la désactivation du double échappement est pratiquement sans danger ? En outre, qu'est-ce que cette mesure de sécurité empêche exactement de se produire ?

15 votes

Si un uri est doublement encodé, les composants non encodés de l'uri peuvent eux-mêmes contenir des caractères réservés et donc (des parties de) l'uri non encodé peut lui-même être un uri valide. En bref, si vous utilisez la chaîne uri non encodée pour construire de nouvelles uri - en particulier des chemins de systèmes de fichiers - et que vous n'échappez pas correctement le nouveau chemin, vous pouvez permettre l'injection de chemin. L'injection de chemin pourrait permettre à un attaquant de tromper votre programme en lui faisant traiter des données qu'il ne devrait pas traiter, ou en lui faisant croire que deux uri sont différentes alors qu'elles sont en fait identiques mais simplement encodées différemment.

2voto

Sk8erPeter Points 2229

Je voudrais juste ajouter quelques informations pour Réponse d'Eamon Nerbonne liés à la " ce qu'il faut faire La partie " " de votre question (sans expliquer le pourquoi).
Vous pouvez aussi 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 (extrait 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 con Default Web Site pour appliquer cette règle au site web par défaut)

  3. Entrez, prêts.

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 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, il 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.

1voto

Charlino Points 11217

Avez-vous pensé à avoir l'URL de recherche comme '/search/a/b/c' ?

Vous devez configurer une route comme

search/{*path}

Et ensuite extraire les valeurs de recherche de votre chaîne de chemin dans l'action.

HTHs
Charles

0 votes

Le problème est que d'autres caractères codés de l'URL (y compris "/" lui-même) pourraient faire partie de la recherche.

0 votes

Ne pourriez-vous pas coder tous les '/' qui font réellement partie de la recherche en '%2F' ?

0voto

mhenry1384 Points 3608

J'ai rencontré ce problème sous IIS 7.5 en faisant un Server.TransferRequest() dans une application.

L'encodage du nom de fichier a causé le problème de double-écriture, mais si je ne l'avais pas encodé, j'aurais rencontré le problème de l'encodage du nom de fichier. "potentiellement dangereux Request.Path" erreur.

L'ajout d'un protocole quelconque, même vide, à l'URL que je passe à Server.TranferRequest() a réglé le problème.

Ne fonctionne pas :

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

Travaux :

context.Server.TransferRequest("://folder/bar%20bar.jpg");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X