Rimuovere / nascondere / disabilitare un numero eccessivo di intestazioni di risposta HTTP in Azure / IIS7 senza UrlScan


86

Devo rimuovere le intestazioni in eccesso (principalmente per superare i test di penetrazione). Ho passato del tempo a cercare soluzioni che implicano l'esecuzione di UrlScan, ma sono complicate in quanto UrlScan deve essere installato ogni volta che viene avviata un'istanza di Azure .

Deve esserci una buona soluzione per Azure che non implichi la distribuzione di programmi di installazione da startup.cmd.

Capisco che le intestazioni di risposta vengono aggiunte in luoghi diversi :

  • Server : aggiunto da IIS.
  • Versione X-AspNet : aggiunta da System.Web.dll al momento di Flush nella classe HttpResponse
  • Versione X-AspNetMvc : aggiunta da MvcHandler in System.Web.dll.
  • X-Powered-By : aggiunto da IIS

Esiste un modo per configurare (tramite web.config ecc.?) IIS7 per rimuovere / nascondere / disabilitare le intestazioni di risposta HTTP per evitare l'avviso "Intestazioni eccessive" su asafaweb.com , senza creare un modulo IIS o distribuire programmi di installazione che devono essere eseguito ogni volta che viene avviata un'istanza di Azure?

Risposte:


139

Le modifiche seguenti consentono di rimuovere queste intestazioni di risposta HTTP in Azure senza scrivere un HttpModule personalizzato.

La maggior parte delle informazioni in rete non sono aggiornate e riguardano UrlScan (che da allora è stato integrato in IIS7, ma con l' RemoveServerHeader=1opzione rimossa). Di seguito è la soluzione più accurata che ho trovato (grazie a questo blog , questa risposta e questo blog combinato).

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

Modificato aprile 2014: è possibile utilizzare gli eventi PreSendRequestHeaders e PreSendRequestContext con i moduli IIS nativi, ma non utilizzarli con i moduli gestiti che implementano IHttpModule. L'impostazione di queste proprietà può causare problemi con le richieste asincrone . La versione corretta consiste nell'usare l'evento BeginRequest.

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var application = sender as HttpApplication;
        if (application != null && application.Context != null)
        {
            application.Context.Response.Headers.Remove("Server");
        }
    }

Per rimuovere X-AspNet-Version , nel web.config trova / crea <system.web>e aggiungi:

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

    ...

Per rimuovere X-AspNetMvc-Version , vai su Global.asax, trova / crea l' Application_Startevento e aggiungi una riga come segue:

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

Per rimuovere X-Powered-By , nel web.config trova / crea <system.webServer>e aggiungi:

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

    ...

Secondo il suggerimento in VS, non è necessario annullare il controllo di richiesta, risposta o risposta
Chris Haines

1
Quando viene utilizzato su IIS non Azure, tenere presente che il pool di applicazioni deve essere in modalità integrata. E .IsLocal dovrebbe essere rimosso durante il debug in locale.
IvanH

5
Non c'è bisogno di "condizioni Yoda" in C # - non consente l'assegnazione in un condizionale, en.wikipedia.org/wiki/Yoda_Conditions
tvanfosson

1
Grazie per la risposta dettagliata, tuttavia ho provato a seguire i passaggi ma ogni volta che eseguo la scansione del sito utilizzando asafweb, viene ancora menzionato un problema relativo all'intestazione eccessiva (X-AspNet-Version). Ho persino usato URLRewrite per rimuovere questa intestazione. Ci sono altre possibilità per rimuoverlo?
Raymond A

4
C'è ancora il problema di richiedere un file inesistente, ad esempio " yoursite / foo.jpg ". Poiché questa richiesta non viene elaborata da MVC, l'intestazione della risposta "Server: IIS xy" sarà ancora presente. Una soluzione che funziona per i siti Web di Azure (e apparentemente SOLO per i siti Web di Azure) consiste nell'aggiungerlo in <system.webServer>: <security xdt: Transform = "Insert"> <requestFiltering removeServerHeader = "true" /> </ security >
adrian h.

12

MSDN ha pubblicato questo articolo su come nascondere le intestazioni nei siti Web di Azure. È ora possibile nascondere il server da web.config aggiungendo una voce a system.webServer

<security>
      <requestFiltering removeServerHeader ="true" />
</security>

VS però aggrotterà le sopracciglia al sopra come non valido. Il link sopra ha il codice come foto, difficile da trovare. La versione MVC è ancora nascosta all'avvio dell'applicazione come sopra, lo stesso per x-powered-by e .Net.


3
Questo è esattamente quello che stavo cercando. Grazie.
Martin Costello

3
Questo potrebbe funzionare per Azure, ma non altrove. I commenti su quell'articolo lo confermano, così come i miei test. La risposta di @ giveme5minutes è il modo in cui funziona.
CrazyPyro

Sarebbe bello sapere cosa è stato implementato per rendere questa funzione: | Soprattutto dal momento che SCAN URL lo ha implementato in precedenza immediatamente.
felickz

6

C'è anche un pacchetto su NuGet che ti aiuta a raggiungere questo obiettivo attraverso poche righe di configurazione e nessuna modifica al codice: NWebsec. I documenti sulla rimozione delle intestazioni di versione possono essere trovati qui: https://github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers

È demo qui: http://www.nwebsec.com/HttpHeaders/VersionHeaders (in Azure)

Disclaimer: sono lo sviluppatore del progetto.


"NWebsec ti aiuta a sopprimere quasi tutte queste intestazioni di versione, cioè tutte tranne l'intestazione Server: Microsoft-IIS / 8.0." :( github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers
felickz

È passato da codeplex a GitHub (aggiorna il link github.com/NWebsec/NWebsec/wiki )
Nordes

6

La risposta di Nick Evans è perfetta, ma ...

Se rimuovi queste intestazioni per motivi di sicurezza , non dimenticare di modificare il ASP.NET Session coockie name! Perché è più facile indovinare la lingua utilizzata o la versione del server quando vedi questo:

inserisci qui la descrizione dell'immagine

Per modificare il nome del cookie: (sii ​​creativo)

<system.web>
  <sessionState cookieName="PHPSESSID" />
</system.web>

La modifica del nome del cookie ha più vantaggi rispetto alla semplice esposizione alla tecnologia del server, ad esempio riduce il rischio di raccolta generica di sessioni di massa
mlhDev

4

Raggruppando le risposte precedenti di @ giveme5minutes e @AKhooli in relazione ai siti Web di Azure più alcuni altri elementi che lo scanner vuole vedere, queste sono le modifiche che ho apportato per rendere ASafaWeb felice con un sito Azure.

Si lamenta ancora che il cookie dell'intestazione di affinità di Azure non sia solo https, ma l'affinità è il tipo di cookie che si desidera riprodurre comunque, giusto?

<system.web>
    <compilation debug="false">
    <httpRuntime enableVersionHeader="false" />
    <httpCookies httpOnlyCookies="true" requireSSL="true" />    
    <customErrors mode="RemoteOnly" defaultRedirect="~/Error.aspx" />
</system.web>

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="X-Frame-Options" value="DENY" />
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
    <security>
      <!--removes Azure headers-->
      <requestFiltering removeServerHeader="true" />
    </security>
</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.