Como remover cabeçalhos de resposta do IIS / ASP.NET

46

Eu tenho alguns servidores IIS / 6.0 em que a segurança está me pedindo para remover alguns cabeçalhos de resposta que são enviados aos navegadores clientes mediante solicitação. Eles estão preocupados em divulgar informações da plataforma por meio de cabeçalhos de resposta. Eu removi todos os HTTP-HEADERS da configuração do IIS do site (X-Powered-By ou algum desses cabeçalhos).

(Eu, pessoalmente, sei que essas informações podem ser facilmente encontradas, mesmo se estiverem ocultas, mas não é minha decisão.)

Cabeçalhos que desejo remover:

  • Servidor - Microsoft-IIS / 6.0
  • Versão X-AspNet - 2.0.50727

Eu também sei que o ASP.NET MVC também emite seu próprio cabeçalho, se você souber removê-lo também, isso seria útil.

  • X-AspNetMvc-Version - 1.0
Bryan Rehbein
fonte

Respostas:

32

Seu departamento de segurança deseja que você faça isso para dificultar a identificação do tipo de servidor. Isso pode diminuir a enxurrada de ferramentas de hackers automatizadas e dificultar a entrada de pessoas no servidor.

No IIS, abra as propriedades do site e vá para a guia Cabeçalhos HTTP. A maioria dos cabeçalhos X pode ser encontrada e removida aqui. Isso pode ser feito para sites individuais ou para o servidor inteiro (modifique as propriedades do objeto Sites da Web na árvore).

Para o cabeçalho do servidor, no IIS6, você pode usar a ferramenta URLScan da Microsoft para remover isso. O software Port 80 também cria um produto chamado ServerMask que cuida disso e muito mais para você.

Para o IIS7, há um ótimo artigo sobre o uso de um módulo personalizado para modificar o cabeçalho do servidor.

Para o cabeçalho MVC, em Global.asax:

MvcHandler.DisableMvcResponseHeader = true;
Justin Scott
fonte
2
Resposta aceita, gostaria de poder compartilhar a resposta com @squillman. Web.config para correção X-ASPNet-Version: <system.web> <httpRuntime enableVersionHeader = "false" /> </system.web>
Bryan Rehbein
A remoção do cabeçalho X coloca isso no meu web.config, portanto, economize algum tempo: <system.webServer> <httpProtocol> <customHeaders> <remove name = "X-Powered-By" /> </customHeaders> </httpProtocol> </system.webServer>
Broam 03/12/2009
Broam, essa é a resposta certa ... para o IIS7. A questão é sobre o IIS6. Isso não tem efeito no IIS6.
Anthony
56

Para remover todos os cabeçalhos personalizados que divulgam muitas informações - os métodos são variados (infelizmente) para o IIS 7:

Nome do cabeçalho: X-Powered-By

Adicionar, acrescentar:

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

na <system.webServer>seção

Nome do cabeçalho: servidor

Implemente um httpModule que retira esse cabeçalho chamando Response.Headers.Remove ("Server") do evento PreSendRequestHeaders. Outro recurso para isso: camuflar seu aplicativo Web ASP.NET MVC no IIS 7

Nome do cabeçalho: X-AspNet-Version

Na seção httpRuntime do web.config - defina:

<httpRuntime enableVersionHeader="false" />

Nome do cabeçalho: X-AspNetMvc-Version

No evento Application_Start em global.asax - execute o seguinte código (C #):

MvcHandler.DisableMvcResponseHeader = true;
Adão
fonte
Gostaria apenas de precisar algo: a maioria desses truques funcionará apenas com o IIS> = 7 no modo Pipeline integrado. No Modo Clássico, na melhor das hipóteses, nada fará (<remover> linhas em web.config) ou lança uma exceção (chamadas diretas para Response.Headers em global.asax, que é outra solução para remover cabeçalhos). Estou trabalhando em um site preso ao modo clássico e, infelizmente, não consegui remover esses cabeçalhos.
AFract
16

Colocar isso no arquivo web.config de um aplicativo ASP.NET se livrará do cabeçalho X-AspNet-Version:

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

Observe que a marca system.web já deve existir no arquivo. Não crie uma duplicata, basta adicionar a tag httpRuntime. A tag httpRuntime também já pode existir. Nesse caso, basta adicionar o atributo ou definir seu valor, se ele já estiver lá.

squillman
fonte
No entanto, isso deixa o cabeçalho 'powered by'.
UpTheCreek
mas quando eu coloco esse código de linha no system.webmeu site cai. Você sabe por quê?
Neda Derakhshesh
5

Tendo acabado de passar pelo ciclo de "fortalecimento" do meu projeto atual - escrevi em blog sobre a abordagem adotada, que inclui um HTTPModule para remover os seguintes cabeçalhos :

Servidor,
versão
X-AspNet , versão X-AspNetMvc,
alimentado por X

Peças pertinentes reproduzidas abaixo:

Mas não há uma maneira fácil de remover o cabeçalho de resposta do servidor via configuração. Felizmente, o IIS7 possui uma infraestrutura de módulo conectável gerenciada que permite ampliar facilmente sua funcionalidade. Abaixo está a fonte de um HttpModule para remover uma lista especificada de cabeçalhos de resposta 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));
        }
    }
}

Assegure-se de assinar o assembly e, em seguida, instale-o no GAC dos servidores da Web e simplesmente faça a seguinte modificação no web.config do seu aplicativo (ou, se desejar que ele seja aplicado globalmente, no 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>
HowardvanRooijen
fonte
2
Suprimir a geração dos cabeçalhos pela configuração parece fazer muito mais sentido do que gerar os cabeçalhos e removê-los.
realMarkusSchmidt
1
Parece que esse link está morto agora. :-(
Danny Schoemann
2

Confira este blog . Não use o código para remover os cabeçalhos de resposta. É instável de acordo com a Microsoft

Use a seção Cabeçalhos personalizados 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>
mitaka
fonte
Esta foi a solução para o meu problema. usando win2008 R2 (IIS 7.5)
paqogomez 17/04
1

Eu uso o seguinte código e funciona para mim iis 7.5

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}
Nasir Mahmood
fonte
3
E suas imagens e conteúdo que não passam pelo pipeline de código?
Mark Sowul
o que você colocou no "servidor"? deveria ser assim? Response.Headers.Remove ("Servidor: Microsoft-IIS / 7.0"); ? ou deveria ser servidor? por favor ajude
neda Derakhshesh
Eu coloquei apenas "Server" nada mais. se o nome do cabeçalho for diferente, você poderá experimentá-lo com um nome diferente.
Nasir Mahmood