Rimuovere l'intestazione della risposta del server IIS7


107

C'è un modo per rimuovere l'intestazione della risposta "Server" da IIS7? Ci sono alcuni articoli che dimostrano che usando HttpModules possiamo ottenere lo stesso risultato. Questo sarà utile se non abbiamo i diritti di amministratore sul server. Inoltre non voglio scrivere filtri ISAPI.

Ho i diritti di amministratore sul mio server. Quindi non voglio fare le cose di cui sopra. Quindi, per favore aiutami a fare lo stesso.


Risposte:


111

Aggiungi questo al tuo global.asax.cs:

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}

11
Non so perché la risposta del modulo http sia più alta di questa, questa è molto più semplice
jjxtra

2
Potresti scoprire di ottenere un NullReferenceExceptionin Cassini se ti affidi HttpContext.Current. Questo post del blog mostra come farlo evitando di rompere il supporto Cassini, se questo è importante per te.
Owen Blacker,

49
@PsychoDad funziona solo per richieste ASP.NET, non per file statici come .css e .js
Max Toro

1
Per eliminare l'intestazione MVC puoi eseguire questa operazione MvcHandler.DisableMvcResponseHeader = true;
ProVega

7
Non è una buona idea usare PreSendRequestHeadersin una classe che implementa IHttpModuleo Global.asax. Ho assistito all'evento congelando l'app sul server sotto stress. L' BeginRequestevento dovrebbe funzionare per apportare modifiche all'intestazione della risposta. Vedi hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx .
Dmitry S.

77

In IIS7 devi usare un modulo HTTP. Compilare quanto segue come libreria di classi in VS:

namespace StrongNamespace.HttpModules
{
  public class CustomHeaderModule : IHttpModule
  { 
    public void Init(HttpApplication context)
    {
      context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    } 

    public void Dispose() { } 

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
      HttpContext.Current.Response.Headers.Set("Server", "Box of Bolts");
    }
  }
}

Quindi aggiungi quanto segue al tuo web.config o configuralo all'interno di IIS (se lo configuri all'interno di IIS, l'assembly deve essere nella GAC).

<configuration>
  <system.webServer>
    <modules>
      <add name="CustomHeaderModule"
       type="StrongNamespace.HttpModules.CustomHeaderModule" />
    </modules>
  </system.webServer>
</configuration>

Eccellente, posso anche modificare questo per rimuovere l'intestazione ETag nella mia server farm.
devstuff

Ciò causa un errore di runtime in casini ... / ASP.NET Dev server
UpTheCreek

2
@UpTheCreek Al server di sviluppo ASP.Net (Cassini) non piacerà quel codice; questo post del blog ha una soluzione, tuttavia: è necessario verificare che i HttpApplication, i HttpRequest, i HttpContexte i HttpResponsenon lo siano null, oltre a verificare che lo HttpRequest.IsLocalsiano false.
Owen Blacker,

2
Poiché la modifica dell'intestazione in PreSendRequestHeaderspotrebbe causare problemi con HttpCacheModule , dovresti invece usare qualcosa di simile PostReleaseRequestState.
Eirik H

5
Il modulo non viene richiamato quando IIS invia l'intestazione 304 Not Modified per i file statici (css / less / images / ecc.) Poiché questo non raggiunge la pipeline ASP.NET, quindi in questa situazione Server: Microsoft IIS / 7.5 è ancora renderizzato
Jano

42

Con URL Rewrite Module versione 2.0 per IIS (UrlRewrite) abilitato, nella sezione di configurazione <configuration><system.webServer><rewrite>aggiungi la regola in uscita:

<outboundRules>
  <rule name="Remove RESPONSE_Server" >
    <match serverVariable="RESPONSE_Server" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>

11
Notare che ciò cancella solo l'intestazione del server, non la rimuove.
Nick Evans

Scusate l'ignoranza ma a che parte devo aggiungere questo?! Ho provato ad aggiungerlo all'interno di <system.webServer>
Vignesh Subramanian

1
Grazie! Funziona in IIS 8.5, è così facile. Non ho un editor di testo ma puoi usare facilmente la GUI. Il nome dovrebbe essere RESPONSE_Server, non solo Server (è qui che all'inizio ho fallito).
Louis Matthijssen

questo è abbastanza buono se hai un'applicazione non ASP.Net, quindi non puoi rimuovere l'intestazione del server con i codici menzionati
mhesabi

4
@vignesh questi sono alcuni sottonodi di configurazione UrlRewrite. Devi metterli sotto un rewritenodo in system.webServer. Attenzione, questo andrà in crash il tuo sito se UrlRewrite non è installato sul server. E faresti meglio a usare prima la console di configurazione IIS per verificare come annota quei nodi di configurazione.
Frédéric

36

Scott Mitchell fornisce in un post sul blog soluzioni per rimuovere le intestazioni non necessarie .

Come già detto qui in altre risposte, per l' Serverintestazione, c'è la soluzione del modulo http , o una soluzione web.config per IIS 10+ , oppure puoi usare URLRewrite invece per cancellarlo .

La soluzione più pratica per una configurazione aggiornata (IIS 10+) è utilizzare removeServerHeaderin web.config:

<system.webServer>
  ...
  <security>
    <requestFiltering removeServerHeader="true" />
  </security>
  ...
</system.webServer>

Per X-AspNet-VersioneX-AspNetMvc-Version , fornisce un modo migliore rispetto a rimuoverli a ogni risposta: semplicemente non generarli affatto.

Utilizzare enableVersionHeaderper la disabilitazione X-AspNet-Version, in web.config

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

Utilizzare MvcHandler.DisableMvcResponseHeadernell'evento .Net Application_Start per la disabilitazioneX-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true;

Infine, rimuovi nella configurazione IIS l' X-Powered-Byintestazione personalizzata in web.config.

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

Attenzione, se hai ARR (Application Request Routing), aggiungerà anche il proprio X-Powered-By, che non verrà rimosso dalle impostazioni delle intestazioni personalizzate. Questo deve essere rimosso tramite Gestione IIS, configurazione dell'Editor sulla radice IIS (non su un sito): vai al system.webServer/proxynodo e imposta arrResponseHeadersu false. Dopo un IISReset, viene preso in considerazione.
(Ho trovato questo qui , tranne che questo post riguarda il vecchio modo IIS 6.0 di configurare le cose.)

Non dimenticare che la soluzione in base al codice dell'applicazione non si applica per impostazione predefinita all'intestazione generata sul contenuto statico (puoi attivare il runAllManagedModulesForAllRequestsper modificarlo, ma fa sì che tutte le richieste vengano eseguite .Net pipeline). Non è un problema perX-AspNetMvc-Version poiché non viene aggiunto su contenuto statico (almeno se la richiesta statica non viene eseguita nella pipeline .Net).

Nota a margine: quando l'obiettivo è mascherare la tecnologia utilizzata, è necessario modificare anche i nomi dei cookie .Net standard ( .ASPXAUTHse l'autenticazione dei moduli è attivata (utilizzare l' nameattributo sul formstag in web.config), ASP.NET_SessionId(utilizzare <sessionState cookieName="yourName" />in web.config sotto il system.webtag), __RequestVerificationToken(modificarlo per codice con AntiForgeryConfig.CookieName, ma sfortunatamente non si applica all'input nascosto che questo sistema genera nell'html)).


18

In realtà i moduli codificati e gli esempi Global.asax mostrati sopra funzionano solo per richieste valide.

Ad esempio, aggiungi <alla fine del tuo URL e otterrai una pagina "Richiesta non valida" che mostra ancora l'intestazione del server. Molti sviluppatori trascurano questo aspetto.

Anche le impostazioni di registro mostrate non funzionano. URLScan è l'UNICO modo per rimuovere l'intestazione "server" (almeno in IIS 7.5).


Funziona per me con il modulo codificato (aggiunto in web.config) anche su una cattiva richiesta;) In global.asax non funziona davvero (ad esempio file statici ecc.)
kapsiR

Speriamo che tu abbia ancora attivato la convalida della richiesta.
Dan Ware

1
qualcuno ha un'alternativa a urlscan per IIS 8+?
herostwist

C'è una soluzione di lavoro almeno in IIS10 +: stackoverflow.com/a/53222967/1671558
Ilya Chernomordik

16

Oppure aggiungi in web.config:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <remove name="X-AspNet-Version" />
            <remove name="X-AspNetMvc-Version" />
            <remove name="X-Powered-By" />
            <!-- <remove name="Server" />  this one doesn't work -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

3
Questo metodo non rimuove l'intestazione "Server". Gli altri vengono rimossi.
Pure.Krome

Puoi sbarazzarti di X-Powered-By nella configurazione delle intestazioni di risposta a livello di server.
Snowburnt

1
Non so se ci sono casi in cui in questo modo rimuove X-AspNet-Versione X-AspNetMvc-Versionintestazione. Quello che so è che in questo modo non funziona sempre (se mai funziona). Vedi la risposta di @Frederic per un modo più affidabile per rimuoverli.
TheBlueSky

C'è un modo ora in IIS10 + per rimuovere l'intestazione del server: stackoverflow.com/a/53222946/1671558
Ilya Chernomordik

14

Questa web.configconfigurazione funziona per rimuovere tutte le intestazioni non necessarie dalla risposta ASP.NET (almeno a partire da IIS 10):

<!--Removes version headers from response -->
<httpRuntime enableVersionHeader="false" />

<httpProtocol>
  <customHeaders>
    <!--Removes X-Powered-By header from response -->
    <clear />
  </customHeaders>
</httpProtocol>

<security>
  <!--Removes Server header from response-->
  <requestFiltering removeServerHeader ="true" />
</security>

Si noti che questo nasconde tutte le intestazioni per l '"applicazione", così come tutti gli altri approcci. Se ad esempio raggiungi una pagina predefinita o una pagina di errore generata dallo stesso IIS o da ASP.NET al di fuori dell'applicazione, queste regole non verranno applicate. Quindi idealmente dovrebbero essere a livello di root in IIS e quel davanzale potrebbe lasciare alcune risposte di errore a IIS stesso.

PS C'è un file bug in IIS 10 che fa sì che a volte mostri l'intestazione del server anche con la configurazione corretta. Dovrebbe essere corretto a questo punto, ma IIS / Windows deve essere aggiornato.


12

Oltre alla risposta URL Rewrite , ecco l'XML completo perweb.config

<system.webServer>
  <rewrite>
    <outboundRules>
      <rule name="Remove RESPONSE_Server" >
        <match serverVariable="RESPONSE_Server" pattern=".+" />
        <action type="Rewrite" value="Company name" />
      </rule>
    </outboundRules>
  </rewrite>
</system.webServer>

Riscrittura URL


Questo rimuove tutte le versioni IIS e ASP dall'hacker
aggie

1
Quanto sopra correzione funziona correttamente per la pages.But web per immagini / icone se 500 Internal Server Error si è verificato è che mostra il Server: Microsoft-IIS / 7.5 al posto del value.Can si Please help me su questo
ravithejag

11

Per rimuovere l' Server:intestazione, vai su Global.asax, trova / crea l' Application_PreSendRequestHeadersevento e aggiungi una riga come segue (grazie a BK e questo blog anche questo non fallirà su Cassini / local dev):

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
    // Remove the "Server" HTTP Header from response
    HttpApplication app = sender as HttpApplication;
    if (null != app && null != app.Request && !app.Request.IsLocal &&
        null != app.Context && null != app.Context.Response)
    {
        NameValueCollection headers = app.Context.Response.Headers;
        if (null != headers)
        {
            headers.Remove("Server");
        }
    }
}

Se si desidera una soluzione completa per rimuovere tutte le intestazioni correlate su Azure / IIS7 e funziona anche con Cassini, vedere questo collegamento , che mostra il modo migliore per disabilitare queste intestazioni senza utilizzare HttpModules o URLScan.


9

Se vuoi solo rimuovere l'intestazione puoi usare una versione abbreviata della risposta di lukiffer:

using System.Web;

namespace Site
{
    public sealed class HideServerHeaderModule : IHttpModule
    {
        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders +=
            (sender, e) => HttpContext.Current.Response.Headers.Remove("Server");
        }
    }
}

E poi in Web.config:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHeaderModule" type="Site.HideServerHeaderModule" />
  </modules>
</system.webServer>

1
Questo è più appropriato perché risorse come css / js non avranno l'intestazione del server, si porta da server a server senza configurazione e l'intestazione della risposta del server non sarà solo vuota, non verrà inviata.
Adam Caviness

Ho visto commenti che runAllManagedModulesForAllRequests = "true" rallenterà la tua app e non è consigliato. Invece si potrebbe usare il modulo urlrewrite outboundRules per cancellare il valore del server anche per i file statici. britishdeveloper.co.uk/2010/06/…
Juri

5

Prova a impostare la HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeadervoce del Registro ad una REG_DWORDdi 1.


Mi sono imbattuto in una strana situazione con la nostra server farm in cui questa impostazione del registro sembra essere l'unica modifica che funziona su tutti i sistemi operativi (W2K8, W2K3) che stiamo utilizzando, sia per IIS6 che per IIS7.
Jerhewet

2
Frustrante, questo non fa alcuna differenza per me, anche dopo aver riavviato la macchina virtuale. Stiamo eseguendo IIS 7.5 su Windows Server 2008 R2 Standard, "Versione 6.1 (Build 7601: Service Pack 1)". Allo stesso modo, il mio OnPreSendRequestHeadersgestore di eventi (vedi sopra) non si attiva mai, per qualche motivo.
Owen Blacker

3
Purtroppo la chiave di registro non sembra funzionare su IIS 7.5
Andrew Csontos

4

UrlScan può anche rimuovere l'intestazione del server utilizzando AlternateServerName=under [options].


2

Seguendo la risposta di eddiegroves , a seconda della versione di URLScan, potresti invece preferire RemoveServerHeader=1sotto[options] .

Non sono sicuro in quale versione di URLScan sia stata aggiunta questa opzione, ma era disponibile nella versione 2.5 e successive.


2

Ho trovato un articolo che spiega perché è necessario modificare il registro e utilizzare uno strumento come UrlScan per impostarlo correttamente in IIS. L'ho seguito sui nostri server e funziona: http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx . Se si utilizza solo UrlScan ma non si effettua la modifica del registro, durante l'interruzione del World Wide Publishing Service, il server restituirà la risposta http del server dal file HTTP.sys. Inoltre, qui ci sono errori comuni nell'utilizzo dello strumento UrlScan: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008


2
Pubblica il tuo codice su Stack Overflow. I collegamenti possono cambiare e interrompersi, quindi pubblicare il codice è molto più utile
Blundering Philosopher

2

In IIS 10, utilizziamo una soluzione simile all'approccio di Drew, ovvero:

using System;
using System.Web;

namespace Common.Web.Modules.Http
{
    /// <summary>
    /// Sets custom headers in all requests (e.g. "Server" header) or simply remove some.
    /// </summary>
    public class CustomHeaderModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

        public void Dispose() { }

        /// <summary>
        /// Event handler that implements the desired behavior for the PreSendRequestHeaders event,
        /// that occurs just before ASP.NET sends HTTP headers to the client.
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            //HttpContext.Current.Response.Headers.Remove("Server");
            HttpContext.Current.Response.Headers.Set("Server", "MyServer");
        }
    }
}

E ovviamente aggiungi un riferimento a quella dll nei tuoi progetti e anche al modulo nelle configurazioni che desideri:

<system.webServer>
    <modules>
      <!--Use http module to remove/customize IIS "Server" header-->
      <add name="CustomHeaderModule" type="Common.Web.Modules.Http.CustomHeaderModule" />
    </modules>
</system.webServer>

NOTA IMPORTANTE 1: questa soluzione richiede un pool di applicazioni impostato come integrato;

NOTA IMPORTANTE2: tutte le risposte all'interno dell'applicazione web saranno influenzate da questo (css e js inclusi);


1

Avevo studiato questo e il metodo URLRewrite funziona bene. Non riesco a trovare il cambiamento scritto bene da nessuna parte. L'ho scritto compatibile con PowerShell v2 e versioni successive e l'ho testato su IIS 7.5.

# Add Allowed Server Variable
    Add-WebConfiguration /system.webServer/rewrite/allowedServerVariables -atIndex 0 -value @{name="RESPONSE_SERVER"}
# Rule Name
    $ruleName = "Remove Server Response Header"
# Add outbound IIS Rewrite Rule
    Add-WebConfigurationProperty -pspath "iis:\" -filter "system.webServer/rewrite/outboundrules" -name "." -value @{name=$ruleName; stopProcessing='False'}
#Set Properties of newly created outbound rule 
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "serverVariable" -value "RESPONSE_SERVER"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "pattern" -value ".*"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/action" -name "type" -value "Rewrite"

1

Puoi aggiungere il codice sottostante nel file Global.asax.cs

    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
    }

1

La soluzione proposta sopra in combinazione ha funzionato per me con le seguenti modifiche. Qui sto pubblicando il mio scenario e la mia soluzione.

Per me volevo rimuovere le seguenti intestazioni:

  • server
  • X-Powered-By
  • X-aspnet-Version
  • X-AspNetMvc-Version

Li ho aggiunti al mio global.asax:

<%@ Application Language="C#" %>
<script runat="server">
    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
        Response.Headers.Remove("X-Powered-By");
        Response.Headers.Remove("X-AspNet-Version");
        Response.Headers.Remove("X-AspNetMvc-Version");
    }
</script>

L'evento di cui sopra non è stato attivato, quindi ho aggiunto il seguito a web.config e ha funzionato.

<modules runAllManagedModulesForAllRequests="true" />

e per rimuovere l'intestazione della versione ho anche aggiunto quanto segue a web.config:

<httpRuntime enableVersionHeader="false" />

Modifiche in web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
    <system.web>
        <httpRuntime enableVersionHeader="false" />
    </system.web>
</configuration>

Spero che sia d'aiuto!


0

Ho provato tutte le cose qui e su molti altri thread di overflow dello stack simili.

Sono rimasto bloccato per un po 'perché ho dimenticato di svuotare la cache del browser dopo aver apportato modifiche alla configurazione. Se non lo fai e il file è nella tua cache locale, te lo restituirà con le intestazioni originali (duh).

Ho funzionato principalmente rimuovendo runAllManagedModulesForAllRequests:

<modules runAllManagedModulesForAllRequests="true">

Ciò ha rimosso le intestazioni estranee dalla maggior parte dei file statici, ma stavo ancora ottenendo l'intestazione "Server" su alcuni file statici nel mio progetto WebAPI in modo spavaldo.

Finalmente ho trovato e applicato questa soluzione e ora tutte le intestazioni indesiderate sono sparite:

https://www.dionach.com/blog/easily-remove-unwanted-http-headers-in-iis-70-to-85

che discute il suo codice che è qui:

https://github.com/Dionach/StripHeaders/releases/tag/v1.0.5

Questo è un modulo in codice nativo. È in grado di rimuovere l'intestazione del server, non solo di cancellare il valore. Per impostazione predefinita rimuove:

  • server
  • X-Powered-By
  • X-ASPNET-Version
  • Server: Microsoft-HTTPAPI / 2.0 - che verrebbe restituito se "la richiesta non riesce a essere passata a IIS"

-1

IIS 7.5 e le versioni eventualmente più recenti hanno il testo dell'intestazione memorizzato in iiscore.dll

Utilizzando un editor esadecimale, trova la stringa e la parola "Server" 53 65 72 76 65 72dopo di essa e sostituisci quelle con byte nulli. In IIS 7.5 ha questo aspetto:

4D 69 63 72 6F 73 6F 66 74 2D 49 49 53 2F 37 2E 35 00 00 00 53 65 72 76 65 72 

A differenza di altri metodi, ciò non comporta una riduzione delle prestazioni. L'intestazione viene inoltre rimossa da tutte le richieste, anche dagli errori interni.

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.