Eliminar / ocultar / deshabilitar los encabezados de respuesta HTTP excesivos en Azure / IIS7 sin UrlScan

86

Necesito eliminar los encabezados excesivos (principalmente para pasar las pruebas de penetración). He dedicado tiempo a buscar soluciones que implican ejecutar UrlScan, pero son engorrosas ya que UrlScan debe instalarse cada vez que se inicia una instancia de Azure .

Debe haber una buena solución para Azure que no implique la implementación de instaladores desde startup.cmd.

Entiendo que los encabezados de respuesta se agregan en diferentes lugares :

  • Servidor : agregado por IIS.
  • X-AspNet-Version : agregado por System.Web.dll en el momento de Flush en la clase HttpResponse
  • X-AspNetMvc-Version : Agregado por MvcHandler en System.Web.dll.
  • X-Powered-By : agregado por IIS

¿Hay alguna forma de configurar (a través de web.config, etc.?) IIS7 para eliminar / ocultar / deshabilitar los encabezados de respuesta HTTP para evitar la advertencia "Encabezados excesivos" en asafaweb.com , sin crear un módulo IIS o implementar instaladores que necesiten ejecutar cada vez que se inicia una instancia de Azure?

Nick Evans
fuente

Respuestas:

139

Los siguientes cambios le permiten quitar estos encabezados de respuesta HTTP en Azure sin escribir un HttpModule personalizado.

La mayor parte de la información en la red está desactualizada e involucra UrlScan (que desde entonces se ha integrado en IIS7, pero con la RemoveServerHeader=1opción eliminada). A continuación se muestra la mejor solución que he encontrado (gracias a este blog , esta respuesta y este blog combinado).

Para eliminar el servidor , vaya a Global.asax, busque / cree el Application_PreSendRequestHeadersevento y agregue lo siguiente (gracias a BK y este blog, esto tampoco fallará en Cassini / dev local):

Editado en abril de 2014: puede usar los eventos PreSendRequestHeaders y PreSendRequestContext con módulos IIS nativos, pero no los use con módulos administrados que implementan IHttpModule. Establecer estas propiedades puede causar problemas con las solicitudes asincrónicas . La versión correcta es utilizar el 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");
        }
    }

Para eliminar X-AspNet-Version , en web.config busque / cree <system.web>y agregue:

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

    ...

Para eliminar X-AspNetMvc-Version , vaya a Global.asax, busque / cree el Application_Startevento y agregue una línea de la siguiente manera:

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

Para eliminar X-Powered-By , en web.config busque / cree <system.webServer>y agregue:

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

    ...
Nick Evans
fuente
De acuerdo con las sugerencias en VS, no es necesario anular la verificación de Solicitud, Respuesta o Respuesta Encabezados
Chris Haines
1
Cuando se usa en IIS, no en Azure, tenga en cuenta que el grupo de aplicaciones debe estar en modo integrado. Y .IsLocal debe eliminarse al depurar localmente.
IvanH
5
No hay necesidad de "condiciones de Yoda" en C #; no permite la asignación en un condicional, en.wikipedia.org/wiki/Yoda_Conditions
tvanfosson
1
Gracias por la respuesta detallada, sin embargo, intenté y seguí los pasos, pero cada vez que escaneo el sitio usando asafweb, todavía menciona un problema sobre el encabezado excesivo (X-AspNet-Version). Incluso utilicé URLRewrite para eliminar este encabezado. ¿Hay otras posibilidades de eliminarlo?
Raymond A
4
Todavía existe el problema de solicitar un archivo inexistente, por ejemplo, " yoursite / foo.jpg ". Dado que MVC no procesa esta solicitud, el encabezado de respuesta "Servidor: IIS xy" seguirá estando allí. Una solución que funciona para los sitios web de Azure (y aparentemente SOLO para los sitios web de Azure) es agregar esto en <system.webServer>: <security xdt: Transform = "Insert"> <requestFiltering removeServerHeader = "true" /> </ security >
adrian h.
12

MSDN publicó este artículo sobre cómo ocultar encabezados en sitios web de Azure. Ahora puede ocultar el servidor de web.config agregando una entrada a system.webServer

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

Sin embargo, VS fruncirá el ceño ante lo anterior como inválido. El enlace anterior tiene un código en forma de imágenes, difícil de encontrar. La versión MVC todavía está oculta en el inicio de la aplicación como se indicó anteriormente, lo mismo para la versión x-powered-by y .Net.

AKhooli
fuente
3
Esto es exactamente lo que estaba buscando. Gracias.
Martin Costello
3
Esto puede funcionar para Azure, pero no en ningún otro lugar. Los comentarios sobre ese artículo confirman esto, al igual que mis propias pruebas. La respuesta de @ giveme5minutes es la forma en que funciona.
CrazyPyro
Sería bueno saber qué se implementó para hacer esta función: | Especialmente desde que URL SCAN implementó previamente esto de forma inmediata.
felickz
6

También hay un paquete en NuGet que lo ayuda a lograr esto a través de algunas líneas de configuración y sin cambios en el código: NWebsec. Los documentos sobre la eliminación de encabezados de versión se pueden encontrar aquí: https://github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers

Se muestra aquí: http://www.nwebsec.com/HttpHeaders/VersionHeaders (en Azure)

Descargo de responsabilidad: soy el desarrollador del proyecto.

klings
fuente
"NWebsec le ayuda a suprimir casi todos los encabezados de estas versiones, es decir, todos menos el encabezado Server: Microsoft-IIS / 8.0". :( github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers
felickz
Se movió de codeplex a GitHub (actualice el enlace github.com/NWebsec/NWebsec/wiki )
Nordes
6

La respuesta de Nick Evans es perfecta, pero ...

Si elimina estos encabezados por motivos de seguridad , no olvide cambiar el ASP.NET Session coockie name! Porque es más fácil adivinar el idioma utilizado o la versión del servidor cuando ves esto:

ingrese la descripción de la imagen aquí

Para cambiar el nombre de la cookie: (sea creativo)

<system.web>
  <sessionState cookieName="PHPSESSID" />
</system.web>
Matthieu Charbonnier
fuente
Cambiar el nombre de la cookie tiene más beneficios que la simple exposición a la tecnología del servidor; por ejemplo, reduce el riesgo de recolección de sesiones masivas genéricas
mlhDev
4

Sumando las respuestas anteriores de @ giveme5minutes y @AKhooli en lo que respecta a los sitios web de Azure, además de algunos otros elementos que el escáner quiere ver, estos son los cambios que hice para que ASafaWeb esté feliz con un sitio de Azure.

Todavía se queja de que la cookie de encabezado de afinidad de Azure no es solo https, pero la afinidad es el tipo de cookie que desea que se reproduzca de todos modos, ¿verdad?

<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>
Timothy Lee Russell
fuente