RequestFiltering & hiddenSegments

Le Request Filtering sous IIS 7.0 suscite de nombreuses questions. Ceci est principalement dû au fait que sa configuration se fait via le fichier ApplicationHost.config et non via l'interface d'administration. Dans cet article, nous parlerons spécifiquement de la section "hiddenSegments"

Par défaut, voici à quoi ressemble la section <requestFiltering> :

    <system.webServer>…
        <security>…
            <requestFiltering>
                <fileExtensions allowUnlisted="true">
                    <add fileExtension=".asax" allowed="false" />
                    <add fileExtension=".ascx" allowed="false" />
                    <add fileExtension=".master" allowed="false" />
                    <add fileExtension=".skin" allowed="false" />
                    <add fileExtension=".browser" allowed="false" />
                    <add fileExtension=".sitemap" allowed="false" />
                    <add fileExtension=".config" allowed="false" />
                    <add fileExtension=".cs" allowed="false" />
                    <add fileExtension=".csproj" allowed="false" />
                    <add fileExtension=".vb" allowed="false" />
                    <add fileExtension=".vbproj" allowed="false" />
                    <add fileExtension=".webinfo" allowed="false" />
                    <add fileExtension=".licx" allowed="false" />
                    <add fileExtension=".resx" allowed="false" />
                    <add fileExtension=".resources" allowed="false" />
                    <add fileExtension=".mdb" allowed="false" />
                    <add fileExtension=".vjsproj" allowed="false" />
                    <add fileExtension=".java" allowed="false" />
                    <add fileExtension=".jsl" allowed="false" />
                    <add fileExtension=".ldb" allowed="false" />
                    <add fileExtension=".dsdgm" allowed="false" />
                    <add fileExtension=".ssdgm" allowed="false" />
                    <add fileExtension=".lsad" allowed="false" />
                    <add fileExtension=".ssmap" allowed="false" />
                    <add fileExtension=".cd" allowed="false" />
                    <add fileExtension=".dsprototype" allowed="false" />
                    <add fileExtension=".lsaprototype" allowed="false" />
                    <add fileExtension=".sdm" allowed="false" />
                    <add fileExtension=".sdmDocument" allowed="false" />
                    <add fileExtension=".mdf" allowed="false" />
                    <add fileExtension=".ldf" allowed="false" />
                    <add fileExtension=".ad" allowed="false" />
                    <add fileExtension=".dd" allowed="false" />
                    <add fileExtension=".ldd" allowed="false" />
                    <add fileExtension=".sd" allowed="false" />
                    <add fileExtension=".adprototype" allowed="false" />
                    <add fileExtension=".lddprototype" allowed="false" />
                    <add fileExtension=".exclude" allowed="false" />
                    <add fileExtension=".refresh" allowed="false" />
                    <add fileExtension=".compiled" allowed="false" />
                    <add fileExtension=".msgx" allowed="false" />
                    <add fileExtension=".vsdisco" allowed="false" />
                    <add fileExtension=".asa" allowed="false" />
                </fileExtensions>
                <verbs allowUnlisted="true" />
                <hiddenSegments>
                    <add segment="web.config" />
                    <add segment="bin" />
                    <add segment="App_code" />
                    <add segment="App_GlobalResources" />
                    <add segment="App_LocalResources" />
                    <add segment="App_WebReferences" />
                    <add segment="App_Data" />
                    <add segment="App_Browsers" />
                </hiddenSegments>
            </requestFiltering>
        </security>…
    </system.webServer>

Récemment, un de mes clients a essayé de modifier le Request Filtering, et plus précisément la section « hiddenSegments », pour pouvoir accéder à une page HTM (par exemple "MS.htm") située dans le répertoire "BIN" de son application. Cette modification résulte en la suppression de la ligne <add segment="bin" /> dans l'ApplicationHost.config :

                <hiddenSegments>
                    <add segment="web.config" />

                    <add segment="App_code" />
                    <add segment="App_GlobalResources" />
                    <add segment="App_LocalResources" />
                    <add segment="App_WebReferences" />
                    <add segment="App_Data" />
                    <add segment="App_Browsers" />
                </hiddenSegments>

Sans cette modification, si on essaye d'accéder à "https://localhost/bin/ms.htm", une erreur du type 404.8 est retournée indiquant bien que la section hiddenSegments empêche l'accès à ce dossier et donc empêche l'affichage de la page MS.HTM :

  • Erreur HTTP 404.8 - Not Found
    • Le module de filtrage des demandes est configuré de manière à refuser un chemin d'accès dans l'URL contenant une section hiddenSegments

Si aucun recyclage de l'application pool ne se produit, cette modification fonctionne sans aucun problème. On peut accéder à "https://localhost/bin/ms.htm" directement

Par contre, dès que l'application pool est recyclé, on obtient l'erreur suivante :

  • Erreur HTTP 404.0 - Not Found
    • La ressource que vous recherchez a été supprimée, a été renommée ou est provisoirement indisponible

Contournement

L'avantage avec IIS 7.0 est que l'on peut configurer presque tout ce que l'on veut au niveau du site web lui-même, avec le fichier ApplicationHost.config, ou au niveau applicatif, avec le fichier Web.Config. Cette fonctionnalité s'appelle la délégation ou la surcharge

!!! Attention !!! Avant de mettre en place le contournement, pensez bien à rajouter la ligne <add segment="bin" /> dans l'ApplicationHost.config afin de revenir à une configuration normale

Dans le fichier ApplicationHost.config on solutionne le problème grâce au tag

<location path="nom_du_site"> (où "nom_du_site" correspond au nom du site web que l'on veut configurer)

ou avec le tag suivant pour l'ensemble des sites web :

<location path="">

 

Voici la modification à apporter à l'ApplicationHost.config pour corriger le problème sur un site nommé "MS"

  <location path="MS" allowOverride="true">
    <system.webServer>
      <security>
        <requestFiltering>
          <hiddenSegments>
            <remove segment="bin" />
          </hiddenSegments>
        </requestFiltering>
      </security>
    </system.webServer>
  </location>

Vous pouvez tester cette modification en collant cet exemple dans votre ApplicationHost.config (il faut le coller juste avant le dernier tag du fichier ApplicationHost.config qui est </configuration>). Il faudra bien entendu modifier le nom du site (ce qui est la seule modification à réaliser dans cet exemple)

 

Pour faire cette modification au niveau applicatif dans le Web.Config il faut réaliser une modification dans l'ApplicationHost.config et une modification dans le Web.Config

  • ApplicationHost.config

      <location path="MS" overrideMode="Allow">
        <system.webServer>
          <security>
            <requestFiltering>
              <hiddenSegments>
              </hiddenSegments>
            </requestFiltering>
          </security>
        </system.webServer>
      </location>

  • Web.config

      <configuration>
        <system.webServer>
          <security>
            <requestFiltering>
              <hiddenSegments>
                <remove segment="bin" />
              </hiddenSegments>
            </requestFiltering>
          </security>
        </system.webServer>
      </configuration>

Le contournement se limite à cette/ces modification(s). Toutefois, pour simplifier un peu les choses, il est possible depuis peu de temps de configurer le Request Filtering via l'interface graphique grâce à un outil nommé "IIS Admin Pack" disponible à l'adresse suivante :

En complément voici un article en anglais présentant le Request Filtering via cette interface :

 

En espérant que cet article vous sera utile.

@ Bientôt

Sylvain Lecerf et L'équipe de support IIS Microsoft France