Cómo quitar los encabezados de respuesta IIS / ASP.NET


46

Tengo un par de servidores IIS / 6.0 cuya seguridad me está pidiendo que elimine un par de encabezados de respuesta que se envían a los navegadores del cliente cuando se solicitan. Les preocupa divulgar información de la plataforma a través de encabezados de respuesta. He eliminado todos los HTTP-HEADERS de la configuración de IIS para el sitio web (X-Powered-By o alguno de esos encabezados).

(Personalmente, sé que esta información se puede encontrar fácilmente, incluso si está oculta, pero no es mi decisión).

Encabezados que quiero eliminar:

  • Servidor - Microsoft-IIS / 6.0
  • Versión X-AspNet - 2.0.50727

También sé que ASP.NET MVC también emite su propio encabezado también, si sabe cómo eliminarlo también, sería útil.

  • X-AspNetMvc-Version - 1.0

Respuestas:


32

Su departamento de seguridad quiere que haga esto para dificultar la identificación del tipo de servidor. Esto puede disminuir el aluvión de herramientas de piratería automatizadas y dificultar que las personas entren en el servidor.

Dentro de IIS, abra las propiedades del sitio web, luego vaya a la pestaña Encabezados HTTP. La mayoría de los encabezados X se pueden encontrar y eliminar aquí. Esto se puede hacer para sitios individuales o para todo el servidor (modifique las propiedades para el objeto Sitios web en el árbol).

Para el encabezado del servidor, en IIS6 puede usar la herramienta URLScan de Microsoft para controlar eso. Port 80 Software también fabrica un producto llamado ServerMask que se encargará de eso, y mucho más, por usted.

Para IIS7 (y superior), puede usar el Módulo de reescritura de URL para reescribir el encabezado del servidor o dejar en blanco su valor. En web.config (en un sitio o en el servidor en su conjunto), agregue este contenido después de instalar el Módulo de reescritura de URL:

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

Puede poner un valor personalizado en la acción de reescritura si lo desea. Esta muestra proviene de este artículo que también tiene otra gran información.

Para el encabezado MVC, en Global.asax:

MvcHandler.DisableMvcResponseHeader = true;

Editado el 11-12-2019 para actualizar la información de IIS7 ya que el enlace del blog de TechNet ya no era válido.


2
Respuesta aceptada, ojalá pudiera compartir la respuesta con @squillman. Web.config para arreglar X-AspNet-Version: <system.web> <httpRuntime enableVersionHeader = "false" /> </system.web>
Bryan Rehbein

La eliminación del encabezado X lo pone en mi web.config, así que ahorre algo de tiempo: <system.webServer> <httpProtocol> <customHeaders> <remove name = "X-Powered-By" /> </customHeaders> </httpProtocol> </system.webServer>
Broam

Broam, esa es la respuesta correcta ... para IIS7. La pregunta es sobre IIS6. Eso no tiene ningún efecto en IIS6.
Anthony

56

Para eliminar todos los encabezados personalizados que revelan demasiada información, los métodos son variados (desafortunadamente) para IIS 7:

Nombre del encabezado: X-Powered-By

Añadir:

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

en la <system.webServer>seccion.

Nombre del encabezado: servidor

Implemente un httpModule que elimine este encabezado llamando a Response.Headers.Remove ("Servidor") desde el evento PreSendRequestHeaders. Otro recurso para esto: Encubrir su aplicación web ASP.NET MVC en IIS 7

Nombre del encabezado: X-AspNet-Version

En la sección httpRuntime de web.config - set:

<httpRuntime enableVersionHeader="false" />

Nombre del encabezado: X-AspNetMvc-Version

Desde el evento Application_Start en global.asax: ejecute el siguiente código (C #):

MvcHandler.DisableMvcResponseHeader = true;

Solo quiero precisar algo: la mayoría de estos trucos solo funcionarán con IIS> = 7 en el modo de canalización integrada. En el modo clásico, en el mejor de los casos no hará nada (<remove> líneas en web.config) o lanzará una excepción (llamadas directas a Response.Headers en global.asax, que es otra solución para eliminar los encabezados). Estoy trabajando en un sitio web atascado en el modo clásico y desafortunadamente no he podido eliminar estos encabezados.
AFract

16

Al poner esto en el archivo web.config de una aplicación ASP.NET, se eliminará el encabezado X-AspNet-Version:

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

Tenga en cuenta que la etiqueta system.web ya debería existir en el archivo. No cree un duplicado, solo agregue la etiqueta httpRuntime. La etiqueta httpRuntime también podría existir. Si es así, solo agregue el atributo o establezca su valor si ya está allí.


Sin embargo, esto deja el encabezado 'alimentado por'.
UpTheCreek

pero cuando pongo este código de línea en system.webmi sitio web se cae. ¿Sabes por qué?
neda Derakhshesh

5

Después de haber pasado por el ciclo de "endurecimiento" en mi proyecto actual , escribí en un blog sobre el enfoque que tomamos, que incluye un HTTPModule para eliminar los siguientes encabezados :

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

Piezas pertinentes reproducidas a continuación:

Pero no hay una manera fácil de eliminar el encabezado de respuesta del servidor a través de la configuración. Afortunadamente, IIS7 tiene una infraestructura de módulo conectable administrada que le permite ampliar fácilmente su funcionalidad. A continuación se muestra la fuente de un HttpModule para eliminar una lista específica de Encabezados de respuesta 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));
        }
    }
}

Asegúrese de firmar el ensamblado, luego puede instalarlo en el GAC de sus servidores web y simplemente realizar la siguiente modificación en el archivo web.config de su aplicación (o si desea que se aplique globalmente, en la máquina.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
Suprimir la generación de los encabezados por configuración parece tener mucho más sentido que generar los encabezados y luego eliminarlos.
realMarkusSchmidt

1
Parece que ese enlace ahora está muerto. :-(
Danny Schoemann

2

Mira este blog . No use código para eliminar encabezados de respuesta. Es inestable según Microsoft

Utilice la sección de encabezados personalizados Web.config en su lugar:

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

Esta fue la solución a mi problema. usando win2008 R2 (IIS 7.5)
paqogomez

1

Yo uso el siguiente código y funciona para mí iis 7.5

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

3
¿Qué pasa con sus imágenes y contenido que no pasa por la tubería de código?
Mark Sowul

¿Qué pusiste en el "Servidor"? debería ser así? Response.Headers.Remove ("Servidor: Microsoft-IIS / 7.0"); ? o debería ser Servidor? por favor ayuda
neda Derakhshesh

Acabo de poner "Servidor" nada más. Si el nombre de su encabezado es diferente, puede probarlo con un nombre diferente.
Nasir Mahmood
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.