Eliminar el encabezado de respuesta del servidor IIS7

107

¿Hay alguna forma de eliminar el encabezado de respuesta "Servidor" de IIS7? Hay algunos artículos que muestran que usando HttpModules podemos lograr lo mismo. Esto será útil si no tenemos derechos de administrador en el servidor. Además, no quiero escribir un filtro ISAPI.

Tengo derechos de administrador en mi servidor. Entonces no quiero hacer las cosas anteriores. Entonces, ayúdame a hacer lo mismo.

usuario247702
fuente
Ver: stackoverflow.com/questions/22401219/…
Mohsen Tavoosi محسن طاوسی

Respuestas:

111

Agregue esto a su global.asax.cs:

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}
bkaid
fuente
11
No sé por qué la respuesta del módulo http es más alta que esta, esta es mucho más fácil
jjxtra
2
Puede encontrar que obtiene un NullReferenceExceptionen Cassini si confía en HttpContext.Current. Esta publicación de blog muestra cómo hacerlo sin romper el soporte de Cassini, si eso es importante para usted.
Owen Blacker
49
@PsychoDad esto funciona solo para solicitudes ASP.NET, no para archivos estáticos como .css y .js
Max Toro
1
Para deshacerse del encabezado MVC, puede hacer esto MvcHandler.DisableMvcResponseHeader = true;
ProVega
7
No es una buena idea usar el PreSendRequestHeadersen una clase que implemente IHttpModuleo Global.asax. He sido testigo del evento que congela la aplicación en el servidor bajo carga de estrés. losBeginRequest evento debería funcionar para realizar cambios en el encabezado de respuesta. Consulte hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx .
Dmitry S.
77

En IIS7 tienes que usar un módulo HTTP. Cree lo siguiente como biblioteca de clases en 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");
    }
  }
}

Luego agregue lo siguiente a su web.config, o configúrelo dentro de IIS (si configura dentro de IIS, el ensamblado debe estar en el GAC).

<configuration>
  <system.webServer>
    <modules>
      <add name="CustomHeaderModule"
       type="StrongNamespace.HttpModules.CustomHeaderModule" />
    </modules>
  </system.webServer>
</configuration>
lukiffer
fuente
Excelente, también puedo modificar esto para eliminar el encabezado ETag en mi granja de servidores.
devstuff
Esto causa un error de tiempo de ejecución en casini ... / ASP.NET Dev server
UpTheCreek
2
@UpTheCreek Al servidor de desarrollo ASP.Net (Cassini) no le gustará ese código; esta entrada del blog tiene una solución a ella, sin embargo - es necesario comprobar que la HttpApplication, la HttpRequest, la HttpContext, y el HttpResponseno son null, así como la comprobación de que HttpRequest.IsLocales false.
Owen Blacker
2
Como modificar el encabezado en PreSendRequestHeaderspodría causar problemas con HttpCacheModule , debería usar algo como PostReleaseRequestState.
Eirik H
5
El módulo no se invoca cuando IIS envía el encabezado 304 No modificado para archivos estáticos (css / less / images / etc.) ya que no llega a la canalización ASP.NET, por lo que en esta situación Servidor: Microsoft IIS / 7.5 todavía se procesa
Jano
42

Con el módulo de reescritura de URL versión 2.0 para IIS (UrlRewrite) habilitado, en la sección de configuración <configuration><system.webServer><rewrite>agregue la regla de salida:

<outboundRules>
  <rule name="Remove RESPONSE_Server" >
    <match serverVariable="RESPONSE_Server" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>
JeffZhnn
fuente
11
Tenga en cuenta que esto solo deja en blanco el encabezado del servidor, no lo elimina.
Nick Evans
Perdón por la ignorancia, pero ¿en qué parte debo agregar esto? Intenté agregarlo dentro de <system.webServer>
Vignesh Subramanian
1
¡Gracias! Funciona en IIS 8.5, esto es muy fácil. No tengo un editor de texto, pero puedes usar la GUI fácilmente. El nombre debe ser RESPONSE_Server, no solo Server (aquí es donde fallé al principio).
Louis Matthijssen
esto es lo suficientemente bueno si tiene una aplicación que no es ASP.Net, por lo que no puede eliminar el encabezado del servidor con los códigos mencionados
mhesabi
4
@vignesh, estos son algunos subnodos de configuración de UrlRewrite. Tienes que ponerlos debajo de un rewritenodo system.webServer. Tenga cuidado, esto bloqueará su sitio si UrlRewrite no está instalado en el servidor. Y es mejor que primero use la consola de configuración de IIS para verificar cómo escribe esos nodos de configuración.
Frédéric
36

Scott Mitchell proporciona en una publicación de blog soluciones para eliminar encabezados innecesarios .

Como ya se dijo aquí en otras respuestas, para el Serverencabezado, existe la solución del módulo http , o una solución web.config para IIS 10+ , o puede usar URLRewrite en su lugar para borrarlo .

La solución más práctica para una configuración actualizada (IIS 10 +) es usar removeServerHeaderen web.config:

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

Para X-AspNet-Versiony X-AspNetMvc-Version, proporciona una mejor manera que eliminarlos en cada respuesta: simplemente no generarlos en absoluto.

Úselo enableVersionHeaderpara deshabilitar X-AspNet-Version, en web.config

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

Usar MvcHandler.DisableMvcResponseHeaderen el evento .Net Application_Start para deshabilitarX-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true;

Y finalmente, elimine en la configuración de IIS el X-Powered-Byencabezado personalizado en web.config.

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

Tenga cuidado, si tiene ARR (Application Request Routing), también agregará el suyo propio X-Powered-By, que no se eliminará mediante la configuración de encabezados personalizados. Este tiene que ser eliminado a través del Administrador de IIS, configuración del Editor en la raíz de IIS (no en un sitio): vaya al system.webServer/proxynodo y establezca arrResponseHeaderen false. Después de una IISReset, se tiene en cuenta.
(He encontrado este aquí , excepto que esta publicación trata sobre la antigua forma de configurar las cosas de IIS 6.0).

No olvide que la solución por código de aplicación no se aplica de forma predeterminada al encabezado generado en contenido estático (puede activar el runAllManagedModulesForAllRequestspara cambiar eso, pero hace que todas las solicitudes se ejecuten en la tubería .Net). No es un problema X-AspNetMvc-Versionya que no se agrega en contenido estático (al menos si las solicitudes estáticas no se ejecutan en la canalización .Net).

Nota al margen: cuando el objetivo es ocultar la tecnología utilizada, también debe cambiar los nombres de las cookies .Net estándar ( .ASPXAUTHsi los formularios están activados (use el nameatributo en la formsetiqueta en web.config), ASP.NET_SessionId(use <sessionState cookieName="yourName" />en web.config debajo de la system.webetiqueta), __RequestVerificationToken(cámbielo por código con AntiForgeryConfig.CookieName, pero desafortunadamente no se aplica a la entrada oculta que este sistema genera en el html)).

Frédéric
fuente
18

En realidad, los módulos codificados y los ejemplos de Global.asax que se muestran arriba solo funcionan para solicitudes válidas.

Por ejemplo, agregue <al final de su URL y obtendrá una página de "Solicitud incorrecta" que aún expone el encabezado del servidor. Muchos desarrolladores pasan por alto esto.

La configuración del registro que se muestra tampoco funciona. URLScan es la ÚNICA forma de eliminar el encabezado "servidor" (al menos en IIS 7.5).

Dan Ware
fuente
Funciona para mí con el módulo codificado (agregado en web.config) incluso en una solicitud incorrecta;) En global.asax no funciona realmente (por ejemplo, archivos estáticos, etc.)
kapsiR
Esperemos que aún tenga activada la validación de solicitudes.
Dan Ware
1
¿Alguien tiene una alternativa a urlscan para IIS 8+?
herostwist
Hay una solución de trabajo al menos en IIS10 +: stackoverflow.com/a/53222967/1671558
Ilya Chernomordik
16

O agregue 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>
Anders
fuente
3
Este método no elimina el encabezado 'Servidor'. Los demás se eliminan.
Pure.Krome
Puede deshacerse de X-Powered-By en la configuración de los encabezados de respuesta en el nivel del servidor.
Snowburnt
1
No sé si hay una manera en los casos en que esta quita X-AspNet-Versiony X-AspNetMvc-Versioncabecera. Lo que sé es que de esta manera no siempre funciona (si es que alguna vez funciona). Consulte la respuesta de @Frederic para obtener una forma más confiable de eliminarlos.
TheBlueSky
Ahora hay una forma en IIS10 + para eliminar el encabezado del servidor: stackoverflow.com/a/53222946/1671558
Ilya Chernomordik
14

Esta web.configconfiguración funciona para eliminar todos los encabezados innecesarios de la respuesta ASP.NET (al menos a partir de 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>

Tenga en cuenta que esto oculta todos los encabezados de la "aplicación", al igual que todos los demás enfoques. Si, por ejemplo, llega a alguna página predeterminada o una página de error generada por el propio IIS o ASP.NET fuera de su aplicación, estas reglas no se aplicarán. Entonces, idealmente, deberían estar en el nivel raíz en IIS y ese umbral puede dejar algunas respuestas de error en el propio IIS.

PD: Hay un error en IIS 10 que hace que a veces muestre el encabezado del servidor incluso con la configuración correcta. Ya debería estar arreglado, pero IIS / Windows tiene que actualizarse.

Ilya Chernomordik
fuente
12

Además de la respuesta de reescritura de URL , aquí está el XML completo paraweb.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>

Reescritura de URL

Vaibhav Garg
fuente
¿Elimina esto todas las versiones de IIS y ASP del hacker?
aggie
1
La solución anterior funciona correctamente para las páginas web, pero para las imágenes / iconos, si se produjo un error interno del servidor 500, se muestra el servidor: Microsoft-IIS / 7.5 en lugar del valor. ¿Me pueden ayudar con esto?
ravithejag
11

Para eliminar el Server:encabezado, vaya a Global.asax, busque / cree el Application_PreSendRequestHeadersevento y agregue una línea de la siguiente manera (gracias a BK y este blog, esto tampoco fallará en Cassini / desarrollador local):

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

Si desea una solución completa para eliminar todos los encabezados relacionados en Azure / IIS7 y también funciona con Cassini, consulte este enlace , que muestra la mejor manera de deshabilitar estos encabezados sin usar HttpModules o URLScan.

Nick Evans
fuente
9

Si solo desea eliminar el encabezado, puede usar una versión abreviada de la respuesta de 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");
        }
    }
}

Y luego en Web.config:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHeaderModule" type="Site.HideServerHeaderModule" />
  </modules>
</system.webServer>
Dibujó Noakes
fuente
1
Esto es más apropiado porque los recursos como css / js no tendrán el encabezado del servidor, se transfieren de servidor a servidor sin configuración y el encabezado de respuesta del servidor no solo estará vacío, no se enviará.
Adam Caviness
He visto comentarios de que runAllManagedModulesForAllRequests = "true" ralentizará su aplicación y no se recomienda. En su lugar, se podría usar el módulo urlrewrite outboundRules para borrar el valor del servidor también para archivos estáticos. britishdeveloper.co.uk/2010/06/…
Juri
5

Intente configurar la HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeaderentrada del registro en una REG_DWORDde 1.

Richard Deeming
fuente
Me encontré con una situación extraña con nuestra granja de servidores en la que esta configuración de registro parece ser el único cambio que funciona en todos los sistemas operativos (W2K8, W2K3) que estamos usando, tanto para IIS6 como para IIS7.
jerhewet
2
Es frustrante que esto no haga ninguna diferencia para mí, incluso después de reiniciar la máquina virtual. Estamos ejecutando IIS 7.5 en Windows Server 2008 R2 Standard, "Versión 6.1 (compilación 7601: Service Pack 1)". De manera similar, mi OnPreSendRequestHeaderscontrolador de eventos (ver arriba) nunca se activa, por alguna razón.
Owen Blacker
3
Desafortunadamente, la clave de registro no parece funcionar en IIS 7.5
Andrew Csontos
4

UrlScan también puede eliminar el encabezado del servidor usando AlternateServerName=under [options].

Eddiegroves
fuente
2

Siguiendo la respuesta de eddiegroves , dependiendo de la versión de URLScan, es posible que prefiera RemoveServerHeader=1debajo [options].

No estoy seguro en qué versión de URLScan se agregó esta opción, pero ha estado disponible en la versión 2.5 y posteriores.

técnico
fuente
2

Encontré un artículo que explica por qué necesitamos editar el Registro y usar una herramienta como UrlScan para configurar esto en IIS correctamente. Lo seguí en nuestros servidores y funciona: http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx . Si solo usa UrlScan pero no hace el cambio de registro, durante el tiempo que esté deteniendo World Wide Publishing Service, su servidor devolverá la respuesta http del servidor desde el archivo HTTP.sys. Además, aquí hay errores comunes de usar la herramienta UrlScan: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008

Pawel
fuente
2
Publique su código en Stack Overflow. Los enlaces pueden cambiar y romperse, por lo que el código de publicación es mucho más útil
Filósofo torpe
2

En IIS 10, usamos una solución similar al enfoque de Drew, es decir:

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

Y, obviamente, agregue una referencia a ese dll en su proyecto (s) y también el módulo en la configuración que desea:

<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: Esta solución necesita un grupo de aplicaciones integrado;

NOTA IMPORTANTE 2: Todas las respuestas dentro de la aplicación web se verán afectadas por esto (css y js incluidos);

xautau
fuente
1

Había investigado esto y el método URLRewrite funciona bien. Parece que no puedo encontrar bien el cambio escrito en ningún sitio. Escribí esto compatible con PowerShell v2 y superior y lo probé en 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"
Bill M
fuente
1

Puede agregar el siguiente código en el archivo Global.asax.cs

    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
    }
Dharmendra Kumar Sharma
fuente
1

La solución propuesta anteriormente en combinación funcionó para mí con los siguientes cambios. Aquí estoy publicando mi escenario y solución.

Para mí, quería eliminar los siguientes encabezados:

  • Servidor
  • X-Powered-By
  • Versión X-AspNet
  • Versión X-AspNetMvc

Agregué estos a mi 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>

El evento anterior no se activó, por lo que agregué lo siguiente a web.config y luego funcionó.

<modules runAllManagedModulesForAllRequests="true" />

y para eliminar el encabezado de la versión, también agregué lo siguiente a web.config:

<httpRuntime enableVersionHeader="false" />

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

¡Espero eso ayude!

Zaki Mohammed
fuente
0

Probé todas las cosas aquí y en varios otros subprocesos de desbordamiento de pila similares.

Me colgué un poco porque olvidé borrar la caché de mi navegador después de hacer cambios de configuración. Si no lo hace y el archivo está en su caché local, se lo devolverá con los encabezados originales (duh).

Lo conseguí en su mayoría funcionando eliminando runAllManagedModulesForAllRequests:

<modules runAllManagedModulesForAllRequests="true">

Esto eliminó los encabezados extraños de la mayoría de los archivos estáticos, pero todavía estaba obteniendo el encabezado "Servidor" en algunos archivos estáticos en mi proyecto WebAPI en swagger.

Finalmente encontré y apliqué esta solución y ahora todo los encabezados no deseados se han ido:

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

que analiza su código que está aquí:

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

Este es un módulo de código nativo. Puede eliminar el encabezado del servidor, no solo borrar el valor. De forma predeterminada, elimina:

  • Servidor
  • X-Powered-By
  • Versión X-Aspnet
  • Servidor: Microsoft-HTTPAPI / 2.0, que se devolvería si "la solicitud no se pasa a IIS"
TechSavvySam
fuente
-1

IIS 7.5 y posiblemente versiones más recientes tienen el texto del encabezado almacenado en iiscore.dll

Usando un editor hexadecimal, busque la cadena y la palabra "Servidor" 53 65 72 76 65 72después de ella y reemplácelas con bytes nulos. En IIS 7.5 se ve así:

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 diferencia de otros métodos, esto no da como resultado una penalización del rendimiento. El encabezado también se elimina de todas las solicitudes, incluso de los errores internos.

3dcdr
fuente