Come rimuovere le intestazioni di risposta IIS / ASP.NET


46

Ho un paio di server IIS / 6.0 che la sicurezza mi sta chiedendo di rimuovere un paio di intestazioni di risposta che vengono inviate ai browser client su richiesta. Sono preoccupati per la divulgazione delle informazioni sulla piattaforma attraverso le intestazioni di risposta. Ho rimosso tutti gli HTTP-HEADERS dalla configurazione IIS per il sito Web (X-Powered-By o qualche intestazione simile).

(So ​​personalmente che queste informazioni possono essere facilmente scoperte, anche se sono nascoste, ma non è la mia chiamata.)

Intestazioni che desidero rimuovere:

  • Server - Microsoft-IIS / 6.0
  • Versione X-AspNet - 2.0.50727

So anche che ASP.NET MVC emette anche la propria intestazione, se sai anche come rimuoverlo, sarebbe utile.

  • X-AspNetMvc-Version - 1.0

Risposte:


32

Il tuo dipartimento di sicurezza vuole che tu faccia questo per rendere il tipo di server più difficile da identificare. Ciò può ridurre la raffica di strumenti di hacking automatizzati e rendere più difficile la penetrazione nel server da parte delle persone.

All'interno di IIS, apri le proprietà del sito Web, quindi vai alla scheda Intestazioni HTTP. La maggior parte delle intestazioni X può essere trovata e rimossa qui. Questo può essere fatto per singoli siti o per l'intero server (modificare le proprietà dell'oggetto Siti Web nella struttura).

Per l'intestazione del server, su IIS6 è possibile utilizzare lo strumento URLScan di Microsoft per remoto. Il software Port 80 crea anche un prodotto chiamato ServerMask che si occuperà di questo, e molto altro, per te.

Per IIS7 (e versioni successive), è possibile utilizzare il modulo di riscrittura URL per riscrivere l'intestazione del server o cancellarne il valore. In web.config (su un sito o sul server nel suo insieme), aggiungi questo contenuto dopo aver installato il modulo di riscrittura URL:

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

Se lo desideri, puoi inserire un valore personalizzato nell'azione di riscrittura. Questo esempio proviene da questo articolo che contiene anche altre ottime informazioni.

Per l'intestazione MVC, in Global.asax:

MvcHandler.DisableMvcResponseHeader = true;

Modificato l'11-12-2019 per aggiornare le informazioni su IIS7 poiché il collegamento al blog TechNet non era più valido.


2
Risposta accettata, vorrei poter condividere la risposta con @squillman. Web.config per correggere la versione di X-AspNet: <system.web> <httpRuntime enableVersionHeader = "false" /> </system.web>
Bryan Rehbein,

La rimozione dell'intestazione X lo inserisce nel mio web.config, quindi risparmia un po 'di tempo: <system.webServer> <httpProtocol> <customHeaders> <remove name = "X-Powered-By" /> </customHeaders> </httpProtocol> </system.webServer>
Broam

Broam, questa è la risposta giusta ... per IIS7. La domanda riguarda IIS6. Ciò non ha alcun effetto su IIS6.
Anthony,

56

Per rimuovere tutte le intestazioni personalizzate che rivelano troppe informazioni, i metodi sono vari (purtroppo) per IIS 7:

Nome intestazione: X-Powered-By

Inserisci:

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

nella <system.webServer>sezione.

Nome intestazione: Server

Implementare un httpModule che elimina questa intestazione chiamando Response.Headers.Remove ("Server") dall'evento PreSendRequestHeaders. Un'altra risorsa per questo: mascherare l'applicazione Web ASP.NET MVC su IIS 7

Nome intestazione: X-AspNet-Version

Nella sezione httpRuntime di web.config - impostare:

<httpRuntime enableVersionHeader="false" />

Nome intestazione: X-AspNetMvc-Version

Dall'evento Application_Start in global.asax: eseguire il codice seguente (C #):

MvcHandler.DisableMvcResponseHeader = true;

Vorrei solo precisare qualcosa: la maggior parte di questi trucchi funzionerà solo con IIS> = 7 in modalità Pipeline integrata. Nella modalità classica, nella migliore delle ipotesi non farà nulla (<remove> linee in web.config) o genererà un'eccezione (chiamate dirette a Response.Headers in global.asax, che è un'altra soluzione per rimuovere le intestazioni). Sto lavorando su un sito Web bloccato in modalità classica e purtroppo non sono stato in grado di rimuovere queste intestazioni.
AFract

16

Mettendolo in un file web.config di un'applicazione ASP.NET si eliminerà l'intestazione X-AspNet-Version:

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

Si noti che il tag system.web dovrebbe già esistere nel file. Non creare un duplicato, basta aggiungere il tag httpRuntime. Il tag httpRuntime potrebbe anche esistere già. In tal caso, aggiungi semplicemente l'attributo o imposta il suo valore se è già presente.


Tuttavia, questo lascia l'intestazione "powered by".
UpTheCreek

ma quando inserisco questo codice di riga nel system.webmio sito web si interrompe. sai perché?
Neda Derakhshesh,

5

Avendo appena attraversato il ciclo di "rafforzamento" del mio progetto attuale, ho scritto un blog sull'approccio che abbiamo adottato, che include un modulo HTTP per la rimozione delle seguenti intestazioni :

Server,
X-AspNet-Version,
X-AspNetMvc-Version,
X-Powered-By

Pezzi pertinenti riprodotti di seguito:

Ma non esiste un modo semplice per rimuovere l'intestazione della risposta del server tramite la configurazione. Fortunatamente IIS7 ha un'infrastruttura di moduli collegabili gestiti che consente di estenderne facilmente le funzionalità. Di seguito è riportato l'origine di un HttpModule per la rimozione di un elenco specificato di intestazioni di risposta 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));
        }
    }
}

Assicurarsi di firmare l'assembly, quindi è possibile installarlo nel GAC dei server Web e apportare semplicemente la seguente modifica al web.config dell'applicazione (o se si desidera che venga applicato a livello globale, al 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>

2
Sopprimere la generazione delle intestazioni per configurazione sembra avere molto più senso che avere le intestazioni generate e quindi rimuoverlo.
realMarkus Schmidt,

1
Sembra che quel link ora sia morto. :-(
Danny Schoemann il

2

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

Utilizzare invece la sezione Intestazioni personalizzate 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>

Questa era la soluzione al mio problema. utilizzando win2008 R2 (IIS 7.5)
paqogomez,

1

Uso il seguente codice e funziona per me iis 7.5

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

3
Che dire delle immagini e dei contenuti che non passano attraverso la pipeline 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
aiutatemi

Ho messo solo "Server" nient'altro. se il nome dell'intestazione è diverso, puoi provarlo con un nome diverso.
Nasir Mahmood,
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.