¿Cómo eliminar los encabezados HTTP predeterminados de ASP.Net MVC?

176

Cada página en una aplicación MVC con la que estoy trabajando establece estos encabezados HTTP en las respuestas:

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

¿Cómo evito que se muestren?

Paul Fryer
fuente
2
Consulte este artículo Eliminando encabezados HTTP innecesarios en IIS y ASP.NET , describe cómo eliminar todos los encabezados enumerados.
Pavel Morshenyuk
@PavelMorshenyuk Disculpe, ¿encontró alguna forma de eliminar el nombre del servidor también? la respuesta aceptada no elimina el servidor
neda Derakhshesh

Respuestas:

285

X-Powered-Byes un encabezado personalizado en IIS. Desde IIS 7, puede eliminarlo agregando lo siguiente a su web.config:

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

Este encabezado también se puede modificar según sus necesidades; para obtener más información, consulte http://www.iis.net/ConfigReference/system.webServer/httpProtocol/customHeaders


Agregue esto a web.configpara deshacerse del X-AspNet-Versionencabezado:

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

Finalmente, para eliminar X-AspNetMvc-Version, editar Global.asax.csy agregar lo siguiente en el Application_Startevento:

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

También puede modificar encabezados en tiempo de ejecución a través del Application_PreSendRequestHeadersevento en Global.asax.cs. Esto es útil si sus valores de encabezado son dinámicos:

protected void Application_PreSendRequestHeaders(object source, EventArgs e)
{
      Response.Headers.Remove("foo");
      Response.Headers.Add("bar", "quux");
}
RedFilter
fuente
44
+1 - Por el bien del interés, 1) ¿Por qué lo harías? 2) ¿Tiene algún efecto adverso?
BritishDeveloper
69
Lo hace por razones de seguridad para ofuscar qué tecnología utiliza para generar sus páginas web. Esto obliga a los hackers a trabajar un poco más duro.
RedFilter
20
@BritishDeveloper Esta fue una recomendación que surgió de una revisión de seguridad. Supongo que es una mejor práctica no anunciar su pila de tecnología, porque eso ayuda a los piratas informáticos a atacar vulnerabilidades específicas con esa plataforma.
Paul Fryer
1
@RedFilter ¡Gracias por su respuesta rápida y detallada!
Paul Fryer
66
En IIS 8 esto no elimina el X-Powered-Byencabezado. Vea otras respuestas sobre cómo lograr esto en web.config.
Knelis
105

También puede eliminarlos agregando código a su archivo 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");
 }
bkaid
fuente
29
En mi caso, solo los últimos tres funcionaron, para "X-Powered-By" que todavía necesitaba<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
Frank van Eykelen
2
En mi caso, ninguno de los encabezados anteriores se eliminó. Estoy usando .net 4.0 e IIS 7. Gracias a otros comentarios en este hilo. He logrado eliminar todos los encabezados no deseados con la excepción de "Servidor", que es el peor de los casos.
Farjad
2
¿Funciona contra tus archivos de contenido / imágenes / etc. que no pasan por la ruta del 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
¿Es extraño para alguien más que "PreSendRequestHeaders" sea en realidad encabezados de respuesta previos al envío?
JDPeckham el
50

Encontré esta configuración en mi web.configque era para un New Web Site...creado en Visual Studio (en lugar de a New Project...). Como la pregunta establece una aplicación ASP.NET MVC, no es tan relevante, pero sigue siendo una opción.

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

Actualización : Además, Troy Hunt tiene un artículo titulado Shhh ... no permita que sus encabezados de respuesta hablen demasiado alto con pasos detallados sobre cómo eliminar estos encabezados, así como un enlace a su herramienta ASafaWeb para buscarlos y otras configuraciones de seguridad.

Kevin Hakanson
fuente
55
La mejor opción pero requiere iis7 + No necesita <borrar /> ellos ... eliminar es suficiente ... también es posible que desee agregar esto a system.webserver para eliminar otra vulnerabilidad: code <security> <requestFiltering> <verbs> <add verb = "OPTIONS" allowed = "false" /> </verbs> </requestFiltering> </security>code
felickz
Creo que el elemento <clear /> borra todos los encabezados, incluido el 'X-Powererd-By', por lo que el elemento <remove /> es redundante.
Jan H
33

.NET Core

Para eliminar el encabezado del servidor , dentro del archivo Program.cs , agregue la siguiente opción:

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

Para dot net core 1, agregue la opción dentro de la llamada .UseKestrel (). Para dot net core 2, agregue la línea después de UseStartup ().

Para eliminar el encabezado X-Powered-By , si se implementa en IIS, edite su web.config y agregue la siguiente sección dentro de la etiqueta system.webServer:

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

.NET 4.5.2

Para eliminar el encabezado del servidor , dentro de su archivo global.asax agregue lo siguiente:

    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

Agregue la siguiente clase de C # a su proyecto:

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

y luego dentro de su web.config agregue la siguiente sección <modules>:

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

Sin embargo, tuve un problema donde los subproyectos no podían encontrar este módulo. No es divertido.

Eliminar el encabezado X-AspNetMvc-Version

Para eliminar la etiqueta '' X-AspNetMvc-Version '', para cualquier versión de .NET, modifique su archivo '' web.config '' para incluir:

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

Gracias a Microsoft por hacer esto increíblemente difícil. O tal vez esa era su intención para poder rastrear las instalaciones de IIS y MVC en todo el mundo ...

Rocklan
fuente
3
En la actualidad, esto se considera una "peor práctica" y es difícil creer que Microsoft todavía haga que "inseguro" sea el valor predeterminado y es muy difícil optar por "seguro". Me recuerda cómo Windows oculta las extensiones de archivo comunes de manera predeterminada para que los usuarios desprevenidos hagan clic en los virus. Me parece recordar que Bill Gates anunció "seguro por defecto" en 2003, ¿qué pasó con esa idea?
Mike Nelson
2
@mikenelson si te hace sentir mejor, intentar eliminar la etiqueta del servidor en nginx es igual de difícil: terminé teniendo que hackear el código fuente real.
Rocklan
Acerca de RemoveServerHeaderModuleque no va a funcionar en el proyecto WebApi.
krypru
32

Como se describe en Encubrimiento de su aplicación web ASP.NET MVC en IIS 7 , puede desactivar el encabezado X-AspNet-Version aplicando la siguiente sección de configuración a su web.config:

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

y elimine el encabezado X-AspNetMvc-Version alterando su Global.asax.cs de la siguiente manera:

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

Como se describe en Encabezados personalizados Puede eliminar el encabezado "X-Powered-By" aplicando la siguiente sección de configuración a su web.config:

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

No hay una manera fácil de eliminar el encabezado de respuesta "Servidor" a través de la configuración, pero puede implementar un HttpModulepara eliminar encabezados HTTP específicos como se describe en Encubrimiento de su aplicación web ASP.NET MVC en IIS 7 y en cómo eliminar servidor. x-aspnet-version-x-aspnetmvc-version-and-x-powered-by-from-response-header-in-iis7 .

RonyK
fuente
Utilizando la respuesta bkaid, puedo eliminar el encabezado "Servidor". IIS 8.
tmorell
La respuesta de bkaid está bien, pero requiere codificación, por lo que encontré la solución que describí como más conveniente, ya que está basada en la configuración.
RonyK
8

Como se muestra en la eliminación de encabezados de servidor estándar en la página de sitios web de Windows Azure , puede eliminar encabezados con lo siguiente:

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

Esto elimina el encabezado del servidor y los encabezados X.

Esto funcionó localmente en mis pruebas en Visual Studio 2015.

Eric Dunaway
fuente
66
Agregar removeServerHeader = "true" me dio un error 500 en mi aplicación ASP.NET 4.5.3
Rocklan
44
@LachlanB esto se agregó en IIS 10: IIS 10.0 agregó el atributo removeServerHeader para suprimir el envío del encabezado del servidor HTTP a clientes remotos. Fuente: iis.net/configreference/system.webserver/security/…
SynerCoder
1
Me encanta que la página de Azure proporcione capturas de pantalla en lugar de bloques de código. Literalmente hacen todo lo posible para que eliminar estas etiquetas innecesarias y potencialmente peligrosas sea lo más difícil posible. Además, no puedo creer que haga referencia a una pregunta SO de tres años para corregir este problema, que no muestra signos de ser corregido.
killa-byte
1
Creo que este Web.config no elimina el encabezado X-AspNetMvc-Version. Para eliminarlo, necesitamos agregar algo en Global.asax stackoverflow.com/a/20739875/1678525
Jan H
8

En Asp.Net Core puede editar los archivos web.config de esta manera:

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

Puede eliminar el encabezado del servidor en las opciones de Kestrel:

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

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

Mi opinión sobre esto:

<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>
mitaka
fuente
4

En aras de la integridad, hay otra forma de eliminar el Server encabezado, utilizando regedit.

Vea este blog de MSDN .

Cree una entrada DWORD llamada DisableServerHeader en la siguiente clave del Registro y establezca el valor en 1.

HKLM \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parámetros

Prefiero encontrar una solución adecuada usando Web.config, pero usarlo <rewrite>no es bueno porque requiere que se instale el módulo de reescritura, e incluso así realmente no eliminará el encabezado, solo vacíelo.

Rudey
fuente
Si esto funciona, suena como una buena solución para mi caso. Tengo 30 sitios web en diferentes versiones de .net, por lo que necesitaría 3 formas diferentes de eliminar los encabezados y actualizar el código en todos estos sitios. Prefiero tener una configuración o registro de configuración que tener que modificar el código.
Mike Nelson
Lo apliqué con éxito hace dos días, funciona muy bien.
Rudey
2

Puede cambiar cualquier encabezado o cualquier cosa en Application_EndRequest()probar esto

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

El encabezado X-Powered-By es agregado por IIS a la respuesta HTTP, por lo que puede eliminarlo incluso a nivel del servidor a través del Administrador IIS:

Puede usar web.config directamente:

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