web-dev-qa-db-fra.com

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

J'ai quelques serveurs IIS/6.0 que la sécurité me demande de supprimer quelques en-têtes de réponse qui sont envoyés aux navigateurs clients sur demande. Ils sont préoccupés par la divulgation d'informations sur la plateforme via des en-têtes de réponse. J'ai supprimé tous les en-têtes HTTP de la configuration IIS pour le site Web (X-Powered-By ou un tel en-tête).

(Personnellement, je sais que ces informations peuvent être facilement trouvées, même si elles sont cachées, mais ce n'est pas mon appel.)

En-têtes que je souhaite supprimer:

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

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

  • version X-AspNetMvc - 1.0
48
Bryan Rehbein

Votre service de sécurité souhaite que vous le fassiez pour rendre le type de serveur plus difficile à identifier. Cela peut réduire le barrage des outils de piratage automatisés et rendre plus difficile pour les personnes de pénétrer dans le serveur.

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 l'ensemble du serveur (modifiez les propriétés de l'objet Sites Web dans l'arborescence).

Pour l'en-tête Serveur, sur IIS6, vous pouvez utiliser l'outil RLScan de Microsoft pour le distancer. Le logiciel Port 80 crée également un produit appelé ServerMask qui s'en occupera, et bien plus encore, pour vous.

Pour IIS7 (et versions ultérieures), vous pouvez utiliser Module de réécriture d'URL 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 de réécriture d'URL:

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

Vous pouvez mettre une valeur personnalisée dans l'action de réécriture si vous le souhaitez. Cet échantillon provient de cet article qui contient également d'autres informations utiles.

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

MvcHandler.DisableMvcResponseHeader = true;

Modifié le 11-12-2019 pour mettre à jour les informations IIS7 car le lien du blog TechNet n'était plus valide.

32
Justin Scott

Pour supprimer tous les en-têtes personnalisés qui divulguent trop d'informations - les méthodes varient (malheureusement) pour IIS 7:

Nom de l'en-tête: X-Powered-By

Ajouter:

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

dans le <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: masquage de votre application Web ASP.NET MVC sur IIS 7

Nom de l'en-tête: Version X-AspNet

Dans la section httpRuntime du web.config - set:

<httpRuntime enableVersionHeader="false" />

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

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

MvcHandler.DisableMvcResponseHeader = true;
58
Adam

Mettre cela 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à là.

16
squillman

Je viens de traverser le cycle de "durcissement" de mon projet actuel - J'ai blogué sur l'approche que nous avons adoptée, qui comprend 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'y a pas de moyen facile de supprimer l'en-tête de réponse du serveur via la configuration. Heureusement, IIS7 possède une infrastructure de modules enfichables gérés qui vous permet d'étendre facilement ses fonctionnalités. Voici la source d'un HttpModule pour 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'assembly, puis vous pouvez l'installer dans le GAC de vos serveurs Web et apporter simplement la modification suivante au web.config de votre application (ou si vous voulez qu'il soit appliqué globalement, au 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>
5
HowardvanRooijen

Vérifiez ce blog . N'utilisez pas de code pour supprimer les en-têtes de réponse. Il 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>
2
mitaka

J'utilise le code suivant et fonctionne 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");
}
1
Nasir Mahmood

J'utilise une combinaison de Web.config et Global.asax.cs pour supprimer tous les en-têtes personnalisés, y compris les en-têtes suivants:

  • Serveur
  • Version X-AspNet
  • Version X-AspNetMvc

Web.config:

<system.web> 
  <httpRuntime enableVersionHeader="false"/> 
</system.web>
<system.webServer>
   <httpProtocol>
      <customHeaders>
         <clear />
      </customHeaders>
   </httpProtocol>
</system.webServer> 

Global.asax.cs:

protected void Application_Start() 
{ 
    MvcHandler.DisableMvcResponseHeader = true; 
}

Voir également https://stackoverflow.com/a/20739875/1678525

0
Jan H