Come rimuovere le intestazioni HTTP predefinite ASP.Net MVC?


176

Ogni pagina in un'applicazione MVC con cui sto lavorando imposta queste intestazioni HTTP nelle risposte:

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

Come posso impedire che vengano visualizzati?


2
Dai un'occhiata a questo articolo Rimozione delle intestazioni HTTP non necessarie in IIS e ASP.NET , descrive come rimuovere tutte le intestazioni elencate.
Pavel Morshenyuk,

@PavelMorshenyuk Mi scusi, hai trovato un modo per rimuovere anche il nome del server? la risposta accettata non rimuove il Server
neda Derakhshesh il

Risposte:


285

X-Powered-Byè un'intestazione personalizzata in IIS. Da IIS 7, è possibile rimuoverlo aggiungendo quanto segue a web.config:

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

Questa intestazione può anche essere modificata in base alle proprie esigenze, per ulteriori informazioni consultare http://www.iis.net/ConfigReference/system.webServer/httpProtocol/customHeaders


Aggiungi questo per web.configeliminare l' X-AspNet-Versionintestazione:

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

Infine, per rimuovere X-AspNetMvc-Version, modificare Global.asax.cse aggiungere quanto segue Application_Startnell'evento:

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

È inoltre possibile modificare le intestazioni in fase di esecuzione tramite l' Application_PreSendRequestHeadersevento in Global.asax.cs. Ciò è utile se i valori dell'intestazione sono dinamici:

protected void Application_PreSendRequestHeaders(object source, EventArgs e)
{
      Response.Headers.Remove("foo");
      Response.Headers.Add("bar", "quux");
}

4
+1 - Per interesse, 1) Perché dovresti? 2) Ha qualche effetto negativo?
British Devevoper

69
Lo fai per motivi di sicurezza per offuscare la tecnologia che usi per generare le tue pagine web. Questo costringe gli hacker a lavorare un po 'più duramente.
RedFilter

20
@BritishDeveloper Questa è stata una raccomandazione emersa da una revisione della sicurezza. Immagino sia una buona pratica non pubblicizzare il tuo stack tecnologico, perché ciò aiuta gli hacker a individuare vulnerabilità specifiche con quella piattaforma.
Paul Fryer,

1
@RedFilter Grazie per la risposta rapida e dettagliata!
Paul Fryer,

6
Su IIS 8 questo non rimuove l' X-Powered-Byintestazione. Vedi altre risposte su come raggiungere questo obiettivo web.config.
Knelis,

105

Puoi anche rimuoverli aggiungendo codice al tuo file 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");
 }

29
Nel mio caso solo gli ultimi tre hanno funzionato, per "X-Powered-By" avevo ancora bisogno<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
Frank van Eykelen,

2
Nel mio caso nessuna delle intestazioni precedenti è stata rimossa. sto usando .net 4.0 e IIS 7. Grazie ad altri commenti in questo thread. Sono riuscito a rimuovere tutte le intestazioni indesiderate ad eccezione di "Server" che è il caso peggiore.
Farjad,

2
Funziona con i tuoi file di contenuto / immagini / ecc. Che non stanno attraversando il percorso del codice?
Mark Sowul,

cosa hai inserito nel "Server"? dovrebbe essere così? Response.Headers.Remove ("Server: Microsoft-IIS / 7.0"); ? o dovrebbe essere "Server"? per favore aiuto
neda Derakhshesh,

strano a qualcun altro che "PreSendRequestHeaders" è in realtà intestazioni di risposta pre invio?
JDPeckham,

50

Ho trovato questa configurazione nella mia web.configche era per un New Web Site...creato in Visual Studio (al contrario di a New Project...). Poiché la domanda indica un'applicazione ASP.NET MVC, non pertinente, ma comunque un'opzione.

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

Aggiornamento : Troy Hunt ha un articolo intitolato Shhh ... non lasciare che le intestazioni delle tue risposte parlino troppo forte con passaggi dettagliati sulla rimozione di queste intestazioni e un link al suo strumento ASafaWeb per la scansione per loro e altre configurazioni di sicurezza.


5
L'opzione migliore ma richiede iis7 + Non è necessario <cancella /> loro ... rimuovi è abbastanza .. inoltre potresti voler aggiungere questo a system.webserver per rimuovere un'altra vulnerabilità: code <security> <requestFiltering> <verbs> <add verb = "OPTIONS" consentita = "false" /> </verbs> </requestFiltering> </security>code
felickz

Penso che l'elemento <clear /> cancella tutte le intestazioni, incluso 'X-Powererd-By', quindi l'elemento <remove /> è ridondante.
Jan H,

33

.NET Core

Per rimuovere l' intestazione del server , all'interno del file Program.cs , aggiungere la seguente opzione:

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

Per dot net core 1, aggiungi l'opzione all'interno della chiamata .UseKestrel (). Per dot net core 2, aggiungere la riga dopo UseStartup ().

Per rimuovere l' intestazione X-Powered-By , se distribuito su IIS, modifica il tuo web.config e aggiungi la seguente sezione all'interno del tag system.webServer:

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

.NET 4.5.2

Per rimuovere l' intestazione del server , nel file global.asax aggiungere quanto segue:

    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);
                        }
                    }
                }
            });
        }

    }

Pre .NET 4.5.2

Aggiungi la seguente classe c # al tuo progetto:

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");
    }
}

e poi nel tuo web.config aggiungi la seguente sezione <modules>:

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

Tuttavia ho avuto un problema in cui i sottoprogetti non riuscivano a trovare questo modulo. Non è divertente.

Rimozione dell'intestazione X-AspNetMvc-Version

Per rimuovere il tag '' X-AspNetMvc-Version '', per qualsiasi versione di .NET, modificare il file '' web.config '' per includere:

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

Grazie Microsoft per aver reso questo incredibilmente difficile. O forse era questa la tua intenzione in modo da poter monitorare le installazioni di IIS e MVC in tutto il mondo ...


3
Al giorno d'oggi questa è considerata una "pratica peggiore" ed è difficile credere che Microsoft renda ancora "insicuro" il valore predefinito e così difficile optare per "sicuro". Mi ricorda come Windows nasconde le estensioni di file comuni per impostazione predefinita, quindi gli utenti ignari faranno clic sui virus. Mi sembra di ricordare Bill Gates che ha annunciato "sicuro di default" nel 2003 - che fine ha fatto quell'idea?
Mike Nelson,

2
@mikenelson se ti fa sentire meglio, provare a rimuovere il tag Server in nginx è altrettanto difficile - ho finito per dover hackerare il codice sorgente stesso.
Rocklan,

A proposito RemoveServerHeaderModuleche non funzionerà nel progetto WebApi.
Krypru,

32

Come descritto in Cloaking dell'applicazione Web ASP.NET MVC su IIS 7 , è possibile disattivare l'intestazione X-AspNet-Version applicando la seguente sezione di configurazione a web.config:

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

e rimuovi l'intestazione X-AspNetMvc-Version modificando Global.asax.cs come segue:

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

Come descritto nelle intestazioni personalizzate È possibile rimuovere l' intestazione "X-Powered-By" applicando la seguente sezione di configurazione al proprio web.config:

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

Non esiste un modo semplice per rimuovere l'intestazione della risposta "Server" tramite la configurazione, ma è possibile implementare una HttpModuleper rimuovere specifiche intestazioni HTTP come descritto in Mantenimento dell'applicazione Web ASP.NET MVC su IIS 7 e in come rimuovere-server- x-aspnet-version-x-aspnetmvc-version-and-x-powered-by-from-response-header-in-iis7 .


Utilizzando bkaid answer sono in grado di rimuovere l'intestazione "Server". IIS 8.
tmorell,

bkaid answer va bene, ma richiede la codifica, quindi ho trovato la soluzione che ho descritto più conveniente, poiché è basata sulla configurazione.
RonyK,

8

Come mostrato in Rimozione delle intestazioni del server standard nella pagina dei siti Web di Windows Azure , è possibile rimuovere le intestazioni con quanto segue:

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

Ciò rimuove l'intestazione del server e le intestazioni X.

Questo ha funzionato localmente nei miei test in Visual Studio 2015.


6
L'aggiunta di removeServerHeader = "true" mi ha dato un errore 500 sulla mia app ASP.NET 4.5.3
Rocklan

4
@LachlanB questo è stato aggiunto in IIS 10: IIS 10.0 ha aggiunto l'attributo removeServerHeader per sopprimere l'invio dell'intestazione del server HTTP ai client remoti. Fonte: iis.net/configreference/system.webserver/security/…
SynerCoder

1
Adoro il fatto che la pagina di Azure offra schermate anziché blocchi di codice. Fanno letteralmente tutto il possibile per rendere la rimozione di questi tag non necessari e potenzialmente pericolosi il più difficile possibile. Inoltre, non posso credere di fare riferimento a una domanda SO di tre anni per correggere questo problema, che non mostra segni di correzione.
killa-byte

1
Penso che questo Web.config non rimuova l'intestazione X-AspNetMvc-Version. Per rimuovere quella abbiamo bisogno di aggiungere qualcosa in Global.asax stackoverflow.com/a/20739875/1678525
Jan H

8

In Asp.Net Core è possibile modificare i file web.config in questo modo:

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

Puoi rimuovere l'intestazione del server nelle opzioni di Kestrel:

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

5

Controlla questo blog Non utilizzare il codice per rimuovere le intestazioni. È instabile secondo Microsoft

La mia opinione su questo:

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

4

Per completezza, c'è un altro modo per rimuovere l' Serverintestazione, usando regedit.

Vedi questo blog MSDN .

Creare una voce DWORD denominata DisableServerHeader nella seguente chiave del Registro di sistema e impostare il valore su 1.

HKLM \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parameters

Preferirei trovare una soluzione adeguata utilizzando Web.config, ma l'utilizzo <rewrite>non è buono perché richiede l'installazione del modulo di riscrittura e anche in questo caso non rimuoverà davvero l'intestazione, ma svuotala.


Se funziona, sembra una buona soluzione per il mio caso. Ho 30 siti Web in diverse versioni di .net e quindi avrei bisogno di 3 modi diversi di rimuovere le intestazioni e aggiornare il codice in tutti questi siti. Preferirei avere un'impostazione di configurazione o un registro piuttosto che dover modificare il codice.
Mike Nelson,

L'ho applicato con successo due giorni fa, funziona benissimo.
Rudey,

2

Puoi cambiare qualsiasi intestazione o qualsiasi cosa in Application_EndRequest()prova questo

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

1

L'intestazione X-Powered-By viene aggiunta da IIS alla risposta HTTP, quindi è possibile rimuoverla anche a livello di server tramite Gestione IIS:

È possibile utilizzare direttamente web.config:

<system.webServer>
   <httpProtocol>
     <customHeaders>
       <remove name="X-Powered-By" />
     </customHeaders>
   </httpProtocol>
</system.webServer>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.