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 à “http://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 à “http://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

Comments (1)

  1. Thiib says:

    Bonjour,

    merci beaucoup pour la résolution, j'ai tenté d'enlever le " <add segment="bin" />" mais en vain

    J'ai donc modifier le web.config et laissé l'autre fichier d'origine. Merci beaucoup