Comment supprimer les en-têtes HTTP par défaut ASP.Net MVC?

179

Chaque page d'une application MVC avec laquelle je travaille définit ces en-têtes HTTP dans les réponses:

X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
X-AspNetMvc-Version: 2.0

Comment les empêcher de s'afficher?

Paul Fryer
la source
2
Consultez cet article Suppression des en-têtes HTTP inutiles dans IIS et ASP.NET , il décrit comment supprimer tous les en-têtes répertoriés.
Pavel Morshenyuk
@PavelMorshenyuk Excusez-moi, avez-vous trouvé un moyen de supprimer également le nom du serveur? la réponse acceptée ne supprime pas le serveur
neda Derakhshesh

Réponses:

293

X-Powered-Byest un en-tête personnalisé dans IIS. Depuis IIS 7, vous pouvez le supprimer en ajoutant ce qui suit à votre web.config:

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

Cet en-tête peut également être modifié selon vos besoins, pour plus d'informations, reportez-vous à http://www.iis.net/ConfigReference/system.webServer/httpProtocol/customHeaders


Ajoutez ceci à web.configpour vous débarrasser de l'en- X-AspNet-Versiontête:

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

Enfin, pour supprimer X-AspNetMvc-Version, modifier Global.asax.cset ajouter les éléments suivants dans l' Application_Startévénement:

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

Vous pouvez également modifier les en-têtes lors de l'exécution via l' Application_PreSendRequestHeadersévénement dans Global.asax.cs. Ceci est utile si vos valeurs d'en-tête sont dynamiques:

protected void Application_PreSendRequestHeaders(object source, EventArgs e)
{
      Response.Headers.Remove("foo");
      Response.Headers.Add("bar", "quux");
}
RedFilter
la source
4
+1 - Par souci d'intérêt, 1) Pourquoi le feriez-vous? 2) Y a-t-il un effet indésirable?
BritishDeveloper
69
Vous faites cela pour des raisons de sécurité afin de masquer la technologie que vous utilisez pour générer vos pages Web. Cela oblige les pirates à travailler un peu plus dur.
RedFilter
21
@BritishDeveloper C'était une recommandation issue d'un examen de sécurité. Je suppose que c'est une bonne pratique de ne pas annoncer votre pile technologique, car cela aide les pirates à cibler des vulnérabilités spécifiques avec cette plate-forme.
Paul Fryer
1
@RedFilter Merci pour votre réponse rapide et détaillée!
Paul Fryer
6
Sur IIS 8, cela ne supprime pas l'en- X-Powered-Bytête. Voir d'autres réponses sur la façon d'y parvenir dans web.config.
Knelis
108

Vous pouvez également les supprimer en ajoutant du code à votre fichier global.asax:

 protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
 {
   HttpContext.Current.Response.Headers.Remove("X-Powered-By");
   HttpContext.Current.Response.Headers.Remove("X-AspNet-Version");
   HttpContext.Current.Response.Headers.Remove("X-AspNetMvc-Version");
   HttpContext.Current.Response.Headers.Remove("Server");
 }
bkaid
la source
29
Dans mon cas, seuls les trois derniers ont fonctionné, pour "X-Powered-By", j'avais encore besoin<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
Frank van Eykelen
2
Dans mon cas, aucun des en-têtes ci-dessus n'a été supprimé. J'utilise .net 4.0 et IIS 7. Merci à d'autres commentaires dans ce fil. J'ai réussi à supprimer tous les en-têtes indésirables à l'exception de "Server" qui est le pire des cas.
Farjad
2
Cela fonctionne-t-il avec vos fichiers de contenu / images / etc qui ne passent pas par le chemin du 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 vous plaît aider
neda Derakhshesh
étrange à quelqu'un d'autre que "PreSendRequestHeaders" soit en fait des en-têtes de réponse avant l'envoi?
JDPeckham
50

J'ai trouvé cette configuration dans mon web.configqui était pour un New Web Site...créé dans Visual Studio (par opposition à a New Project...). Étant donné que la question indique une application ASP.NET MVC, pas aussi pertinente, mais toujours une option.

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <clear />
      <remove name="X-Powered-By" />
    </customHeaders>
   </httpProtocol>
</system.webServer>

Mise à jour : De plus, Troy Hunt a un article intitulé Shhh… ne laissez pas vos en-têtes de réponse parler trop fort avec des étapes détaillées sur la suppression de ces en-têtes ainsi qu'un lien vers son outil ASafaWeb pour les rechercher et d'autres configurations de sécurité.

Kevin Hakanson
la source
5
Meilleure option mais nécessite iis7 + Vous n'avez pas besoin de les <effacer /> ... supprimer suffit ... vous pouvez également ajouter ceci à system.webserver pour supprimer une autre vulnérabilité: code <security> <requestFiltering> <verbs> <add verb = "OPTIONS" allowed = "false" /> </verbs> </requestFiltering> </security>code
felickz
Je pense que l'élément <clear /> efface tous les en-têtes, y compris le «X-Powererd-By», donc l'élément <remove /> est redondant.
Jan H
33

.NET Core

Pour supprimer l'en- tête du serveur , dans le fichier Program.cs , ajoutez l'option suivante:

.UseKestrel(opt => opt.AddServerHeader = false)

Pour dot net core 1, ajoutez l'option à l'intérieur de l'appel .UseKestrel (). Pour dot net core 2, ajoutez la ligne après UseStartup ().

Pour supprimer l'en - tête X-Powered-By , s'il est déployé sur IIS, modifiez votre web.config et ajoutez la section suivante à l'intérieur de la balise system.webServer:

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

.NET 4.5.2

Pour supprimer l'en- tête Server , dans votre fichier global.asax , ajoutez ce qui suit:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string[] headers = { "Server", "X-AspNet-Version" };

        if (!Response.HeadersWritten)
        {
            Response.AddOnSendingHeaders((c) =>
            {
                if (c != null && c.Response != null && c.Response.Headers != null)
                {
                    foreach (string header in headers)
                    {
                        if (c.Response.Headers[header] != null)
                        {
                            c.Response.Headers.Remove(header);
                        }
                    }
                }
            });
        }

    }

Avant .NET 4.5.2

Ajoutez la classe c # suivante à votre projet:

public class RemoveServerHeaderModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    public void Dispose() { }

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpContext.Current.Response.Headers.Remove("Server");
    }
}

puis dans votre web.config, ajoutez la section <modules> suivante:

<system.webServer>
    ....
 <modules>
    <add name="RemoveServerHeaderModule" type="MyNamespace.RemoveServerHeaderModule" />
 </modules>

Cependant, j'ai eu un problème où les sous-projets ne pouvaient pas trouver ce module. Pas drôle.

Suppression de l'en-tête X-AspNetMvc-Version

Pour supprimer la balise '' X-AspNetMvc-Version '', pour toute version de .NET, modifiez votre fichier '' web.config '' pour inclure:

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

Merci Microsoft d'avoir rendu cela incroyablement difficile. Ou peut-être que c'était votre intention afin que vous puissiez suivre les installations IIS et MVC à travers le monde ...

Rocklan
la source
4
De nos jours, cela est considéré comme une «pire pratique» et il est difficile de croire que Microsoft fait toujours de «non sécurisé» la valeur par défaut et il est donc difficile de choisir «sécurisé». Cela me rappelle comment Windows masque les extensions de fichiers courantes par défaut afin que les utilisateurs sans méfiance cliquent sur les virus. Je me souviens que Bill Gates a annoncé «sécurisé par défaut» en 2003 - qu'est-il arrivé à cette idée?
mike nelson
2
@mikenelson si cela vous fait vous sentir mieux, essayer de supprimer la balise Server dans nginx est tout aussi difficile - j'ai fini par devoir pirater le code source lui-même.
Rocklan
À propos, RemoveServerHeaderModulecela ne fonctionnera pas dans le projet WebApi.
krypru le
32

Comme décrit dans Cloaking votre application Web ASP.NET MVC sur IIS 7 , vous pouvez désactiver l'en-tête X-AspNet-Version en appliquant la section de configuration suivante à votre web.config:

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

et supprimez l'en-tête X-AspNetMvc-Version en modifiant votre Global.asax.cs comme suit:

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

Comme décrit dans En- têtes personnalisés Vous pouvez supprimer l'en-tête «X-Powered-By» en appliquant la section de configuration suivante à votre web.config:

<system.webServer>
   <httpProtocol>
      <customHeaders>
         <clear />
      </customHeaders>
   </httpProtocol>
</system.webServer>

Il n'y a pas de moyen simple de supprimer l'en-tête de réponse "Serveur" via la configuration, mais vous pouvez implémenter un HttpModulepour supprimer des en-têtes HTTP spécifiques comme décrit dans Cloaking votre application Web ASP.NET MVC sur IIS 7 et dans how-to-remove-server- x-aspnet-version-x-aspnetmvc-version-et-x-powered-by-from-the-response-header-in-iis7 .

RonyK
la source
En utilisant bkaid answer, je peux supprimer l'en-tête "Server". IIS 8.
tmorell
La réponse bkaid est bonne, mais elle nécessite un codage, j'ai donc trouvé la solution que j'ai décrite comme plus pratique, car elle est basée sur la configuration.
RonyK
8

Comme indiqué sur la page Suppression des en-têtes de serveur standard sur la page Sites Web Windows Azure , vous pouvez supprimer les en-têtes avec les éléments suivants:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <clear />
      </customHeaders>
    </httpProtocol>
    <security>
      <requestFiltering removeServerHeader="true"/>
    </security>
  </system.webServer>
  <system.web>
    <httpRuntime enableVersionHeader="false" />
  </system.web>
</configuration>

Cela supprime l'en-tête du serveur et les en-têtes X.

Cela a fonctionné localement dans mes tests dans Visual Studio 2015.

Eric Dunaway
la source
6
L'ajout de removeServerHeader = "true" m'a donné une erreur 500 sur mon application ASP.NET 4.5.3
Rocklan
4
@LachlanB cela a été ajouté dans IIS 10: IIS 10.0 a ajouté l'attribut removeServerHeader pour supprimer l'envoi de l'en-tête du serveur HTTP aux clients distants. Source: iis.net/configreference/system.webserver/security/…
SynerCoder
2
J'aime le fait que la page Azure propose des captures d'écran plutôt que des blocs de code. Ils font littéralement tout ce qu'ils peuvent pour rendre la suppression de ces balises inutiles et potentiellement dangereuses aussi difficile que possible. De plus, je ne peux pas croire que je fais référence à une question SO datant de trois ans pour corriger ce problème, qui ne montre aucun signe de correction.
killa-byte
1
Je pense que ce Web.config ne supprime pas l'en-tête X-AspNetMvc-Version. Pour supprimer celui-ci, nous devons ajouter quelque chose dans le fichier Global.asax stackoverflow.com/a/20739875/1678525
Jan H
8

Dans Asp.Net Core, vous pouvez modifier les fichiers web.config comme ceci:

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

Vous pouvez supprimer l'en-tête du serveur dans les options Kestrel:

            .UseKestrel(c =>
            {
                // removes the server header
                c.AddServerHeader = false;
            }) 
Darxtar
la source
5

Consultez ce blog N'utilisez pas de code pour supprimer les en-têtes. Il est instable selon Microsoft

Mon avis sur ceci:

<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
4

Par souci d'exhaustivité, il existe un autre moyen de supprimer le Server tête, en utilisant regedit.

Consultez ce blog MSDN .

Créez une entrée DWORD appelée DisableServerHeader dans la clé de Registre suivante et définissez la valeur sur 1.

HKLM \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parameters

Je préfère trouver une solution appropriée en utilisant Web.config, mais l'utilisation <rewrite>n'est pas bonne car elle nécessite l'installation du module de réécriture, et même dans ce cas, il ne supprimera pas vraiment l'en-tête, il suffit de le vider.

Rudey
la source
Si cela fonctionne, cela semble être une bonne solution pour mon cas. J'ai 30 sites Web dans différentes versions de .net et j'aurais donc besoin de 3 façons différentes de supprimer les en-têtes et de mettre à jour le code dans tous ces sites. Je préfère avoir un paramètre de configuration ou un registre que de devoir modifier le code.
mike nelson
J'ai appliqué cela avec succès il y a deux jours, fonctionne très bien.
Rudey
3

Vous pouvez modifier n'importe quel en-tête ou quoi que Application_EndRequest()ce soit en essayant ceci

protected void Application_EndRequest()
{
    // removing excessive headers. They don't need to see this.
    Response.Headers.Remove("header_name");
}
Emdadul Sawon
la source
1

L'en-tête X-Powered-By est ajouté par IIS à la réponse HTTP, vous pouvez donc le supprimer même au niveau du serveur via IIS Manager:

Vous pouvez utiliser le web.config directement:

<system.webServer>
   <httpProtocol>
     <customHeaders>
       <remove name="X-Powered-By" />
     </customHeaders>
   </httpProtocol>
</system.webServer>
Mahesh Sdsraju
la source