Comment supprimer les en-têtes de réponse IIS / ASP.NET

46

La sécurité me demande de supprimer deux ou trois en-têtes de réponse envoyés aux navigateurs clients à la demande de plusieurs serveurs IIS / 6.0. Ils s'inquiètent de la divulgation d'informations sur la plate-forme via des en-têtes de réponse. J'ai supprimé tous les HTTP-HEADERS de la configuration IIS du site Web (X-Powered-By ou un tel en-tête).

(Personnellement, je sais que cette information peut être facilement trouvée, même si elle est cachée, mais ce n'est pas mon appel.)

En-têtes que je veux supprimer:

  • Serveur - Microsoft-IIS / 6.0
  • X-AspNet-Version - 2.0.50727

Je sais également qu'ASP.NET MVC émet également son propre en-tête, si vous savez comment le supprimer également, cela serait utile.

  • X-AspNetMvc-Version - 1.0
Bryan Rehbein
la source

Réponses:

32

Votre service de sécurité vous demande de le faire pour rendre le type de serveur plus difficile à identifier. Cela pourrait réduire le nombre d'outils de piratage automatisés et rendre plus difficile l'accès au serveur par des personnes.

Dans IIS, ouvrez les propriétés du site Web, puis accédez à l'onglet En-têtes HTTP. La plupart des en-têtes X peuvent être trouvés et supprimés ici. Cela peut être fait pour des sites individuels ou pour le serveur entier (modifiez les propriétés de l'objet Sites Web dans l'arborescence).

Pour l’en-tête du serveur, sous IIS6, vous pouvez utiliser l’ outil URLScan de Microsoft pour le supprimer . Port 80 Software fabrique également un produit appelé ServerMask qui s’occupera de cela, et de bien d’autres, pour vous.

Pour IIS7 (et versions ultérieures), vous pouvez utiliser le module URL Rewrite pour réécrire l'en-tête du serveur ou effacer sa valeur. Dans web.config (sur un site ou sur le serveur dans son ensemble), ajoutez ce contenu après l'installation du module URL Rewrite:

<rewrite>    
  <outboundRules rewriteBeforeCache="true">
    <rule name="Remove Server header">
      <match serverVariable="RESPONSE_Server" pattern=".+" />
      <action type="Rewrite" value="" />
    </rule>
  </outboundRules>
</rewrite>

Vous pouvez définir une valeur personnalisée dans l'action de réécriture si vous le souhaitez. Cet exemple provient de cet article qui contient également d’autres informations intéressantes.

Pour l'en-tête MVC, dans Global.asax:

MvcHandler.DisableMvcResponseHeader = true;

Édité le 11-12-2019 pour mettre à jour les informations IIS7, car le lien de blog TechNet n'était plus valide.

Justin Scott
la source
2
Réponse acceptée, j'aimerais pouvoir partager la réponse avec @squillman. Web.config pour corriger X-AspNet-Version: <system.web> <httpRuntime enableVersionHeader = "false" /> </system.web>
Bryan Rehbein le
La suppression de l'en-tête X place ceci dans mon fichier web.config. Par conséquent, gagnez du temps: <system.webServer> <httpProtocol> <customHeaders> <remove name = "X-Powered-By" /> </ customHeaders> </ httpProtocol> </ system.webServer>
Broam
Broam, c'est la bonne réponse ... pour IIS7. La question concerne IIS6. Cela n'a aucun effet sur IIS6.
Anthony
56

Pour supprimer tous les en-têtes personnalisés contenant trop d'informations, les méthodes sont différentes (malheureusement) pour IIS 7:

Nom d'en-tête: X-Powered-By

Ajouter:

<httpProtocol>
  <customHeaders>
    <remove name="X-Powered-By" />
  </customHeaders>
</httpProtocol>

dans la <system.webServer>section.

Nom d'en-tête: Serveur

Implémentez un httpModule qui supprime cet en-tête en appelant Response.Headers.Remove ("Server") à partir de l'événement PreSendRequestHeaders. Une autre ressource pour cela: masquer votre application Web ASP.NET MVC sur IIS 7

Nom d'en-tête: X-AspNet-Version

Dans la section httpRuntime de web.config - set:

<httpRuntime enableVersionHeader="false" />

Nom d'en-tête: X-AspNetMvc-Version

A partir de l'événement Application_Start dans global.asax - exécutez le code suivant (C #):

MvcHandler.DisableMvcResponseHeader = true;
Adam
la source
Je voudrais juste préciser quelque chose: la plupart de ces astuces ne fonctionneront qu'avec IIS> = 7 en mode Pipeline intégré. En mode classique, au mieux, il ne fait rien (<remove> lignes dans web.config) ou ne lève pas une exception (appels directs à Response.Headers dans global.asax, une autre solution permettant de supprimer les en-têtes). Je travaille sur un site Web collé au mode classique et, malheureusement, je n'ai pas pu supprimer ces en-têtes.
AFract
16

Le placer dans le fichier web.config d'une application ASP.NET supprimera l'en-tête X-AspNet-Version:

<system.web>
<httpRuntime enableVersionHeader="false" />
</system.web>

Notez que la balise system.web doit déjà exister dans le fichier. Ne créez pas de doublon, ajoutez simplement la balise httpRuntime. La balise httpRuntime peut également déjà exister. Si c'est le cas, ajoutez simplement l'attribut ou définissez sa valeur s'il est déjà présent.

écailleur
la source
Cependant, cela laisse l'en-tête 'powered by'.
UpTheCreek
mais quand je mets ce code de ligne dans le system.webmon site Web tombe en panne. est-ce que tu sais pourquoi?
Neda Derakhshesh le
5

Je viens de terminer le cycle de «durcissement» de mon projet actuel - j'ai blogué sur notre approche, qui inclut un HTTPModule pour supprimer les en-têtes suivants :

Serveur, version
X-AspNet, version
X-AspNetMvc,
X-Powered-By

Pièces pertinentes reproduites ci-dessous:

Mais il n’existe pas de moyen simple de supprimer l’en-tête de réponse du serveur via la configuration. Heureusement, IIS7 possède une infrastructure de module enfichable gérée qui vous permet d'étendre facilement ses fonctionnalités. Vous trouverez ci-dessous la source d'un module HttpModule permettant de supprimer une liste spécifiée d'en-têtes de réponse HTTP:

namespace Zen.Core.Web.CloakIIS
{
    #region Using Directives

    using System;
    using System.Collections.Generic;
    using System.Web;

    #endregion

    /// <summary>
    /// Custom HTTP Module for Cloaking IIS7 Server Settings to allow anonymity
    /// </summary>
    public class CloakHttpHeaderModule : IHttpModule
    {
        /// <summary>
        /// List of Headers to remove
        /// </summary>
        private List<string> headersToCloak;

        /// <summary>
        /// Initializes a new instance of the <see cref="CloakHttpHeaderModule"/> class.
        /// </summary>
        public CloakHttpHeaderModule()
        {
            this.headersToCloak = new List<string>
                                      {
                                              "Server",
                                              "X-AspNet-Version",
                                              "X-AspNetMvc-Version",
                                              "X-Powered-By",
                                      };
        }

        /// <summary>
        /// Dispose the Custom HttpModule.
        /// </summary>
        public void Dispose()
        {
        }

        /// <summary>
        /// Handles the current request.
        /// </summary>
        /// <param name="context">
        /// The HttpApplication context.
        /// </param>
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += this.OnPreSendRequestHeaders;
        }

        /// <summary>
        /// Remove all headers from the HTTP Response.
        /// </summary>
        /// <param name="sender">
        /// The object raising the event
        /// </param>
        /// <param name="e">
        /// The event data.
        /// </param>
        private void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            this.headersToCloak.ForEach(h => HttpContext.Current.Response.Headers.Remove(h));
        }
    }
}

Assurez-vous de signer l'ensemble, puis installez-le dans le GAC de vos serveurs Web et apportez simplement les modifications suivantes au fichier web.config de votre application (ou, si vous souhaitez qu'il soit appliqué globalement, au fichier machine.config):

<configuration>
    <system.webServer>
        <modules>
            <add name="CloakHttpHeaderModule" 
                 type="Zen.Core.Web.CloakIIS.CloakHttpHeaderModule, Zen.Core.Web.CloakIIS, 
                       Version=1.0.0.0, Culture=neutral, PublicKeyToken=<YOUR TOKEN HERE>" />
        </modules>
    </system.webServer>
</configuration>
Howardvan Rooijen
la source
2
Supprimer la génération des en-têtes par configuration semble avoir beaucoup plus de sens que de générer les en-têtes, puis le supprimer.
realMarkusSchmidt
1
On dirait que ce lien est maintenant mort. :-(
Danny Schoemann
2

Vérifiez ce blog . N'utilisez pas de code pour supprimer les en-têtes de réponse. C'est instable selon Microsoft

Utilisez plutôt la section En-têtes personnalisés Web.config:

<system.webServer>          
<httpProtocol>
    <!-- Security Hardening of HTTP response headers -->
    <customHeaders>
        <!--Sending the new X-Content-Type-Options response header with the value 'nosniff' will prevent 
                Internet Explorer from MIME-sniffing a response away from the declared content-type. -->
        <add name="X-Content-Type-Options" value="nosniff" />

        <!-- X-Frame-Options tells the browser whether you want to allow your site to be framed or not. 
                 By preventing a browser from framing your site you can defend against attacks like clickjacking. 
                 Recommended value "x-frame-options: SAMEORIGIN" -->
        <add name="X-Frame-Options" value="SAMEORIGIN" />

        <!-- Setting X-Permitted-Cross-Domain-Policies header to “master-only” will instruct Flash and PDF files that 
                 they should only read the master crossdomain.xml file from the root of the website. 
                 https://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
        <add name="X-Permitted-Cross-Domain-Policies" value="master-only" />

        <!-- X-XSS-Protection sets the configuration for the cross-site scripting filter built into most browsers. 
                 Recommended value "X-XSS-Protection: 1; mode=block". -->
        <add name="X-Xss-Protection" value="1; mode=block" />

        <!-- Referrer-Policy allows a site to control how much information the browser includes with navigations away from a document and should be set by all sites. 
                 If you have sensitive information in your URLs, you don't want to forward to other domains 
                 https://scotthelme.co.uk/a-new-security-header-referrer-policy/ -->
        <add name="Referrer-Policy" value="no-referrer-when-downgrade" />

        <!-- Remove x-powered-by in the response header, required by OWASP A5:2017 - Do not disclose web server configuration -->
        <remove name="X-Powered-By" />

        <!-- Ensure the cache-control is public, some browser won't set expiration without that  -->
        <add name="Cache-Control" value="public" />
    </customHeaders>
</httpProtocol>

<!-- Prerequisite for the <rewrite> section
            Install the URL Rewrite Module on the Web Server https://www.iis.net/downloads/microsoft/url-rewrite -->
<rewrite>
    <!-- Remove Server response headers (OWASP Security Measure) -->
    <outboundRules rewriteBeforeCache="true">
        <rule name="Remove Server header">
            <match serverVariable="RESPONSE_Server" pattern=".+" />

            <!-- Use custom value for the Server info -->
            <action type="Rewrite" value="Your Custom Value Here." />
        </rule>
    </outboundRules>
</rewrite>
</system.webServer>
mitaka
la source
C'était la solution à mon problème. en utilisant win2008 R2 (IIS 7.5)
paqogomez
1

J'utilise le code suivant et travaille pour moi IIS 7.5

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}
Nasir Mahmood
la source
3
Qu'en est-il des images et du contenu qui ne passent pas par le pipeline de code?
Mark Sowul
qu'avez-vous mis dans le "serveur"? devrait-il en être ainsi? Response.Headers.Remove ("Serveur: Microsoft-IIS / 7.0"); ? ou il devrait être serveur?
S'il
Je viens de mettre "Serveur" rien d'autre. Si votre nom d'en-tête est différent, vous pouvez l'essayer avec un nom différent.
Nasir Mahmood