Como remover os cabeçalhos HTTP padrão do ASP.Net MVC?

176

Cada página em um aplicativo MVC com o qual estou trabalhando define esses cabeçalhos HTTP nas respostas:

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

Como evito que eles sejam exibidos?

Paul Fryer
fonte
2
Confira este artigo Removendo cabeçalhos HTTP desnecessários no IIS e ASP.NET , e descreve como remover todos os cabeçalhos listados.
Pavel Morshenyuk 5/08
@PavelMorshenyuk Com licença, você encontrou alguma maneira de remover o nome do servidor também? a resposta aceita não remove o servidor
neda Derakhshesh

Respostas:

285

X-Powered-Byé um cabeçalho personalizado no IIS. Desde o IIS 7, você pode removê-lo adicionando o seguinte ao seu web.config:

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

Esse cabeçalho também pode ser modificado de acordo com suas necessidades, para obter mais informações, consulte http://www.iis.net/ConfigReference/system.webServer/httpProtocol/customHeaders


Adicione isso para web.configse livrar do X-AspNet-Versioncabeçalho:

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

Por fim, para remover X-AspNetMvc-Version, editar Global.asax.cse adicionar o seguinte no Application_Startevento:

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

Você também pode modificar cabeçalhos em tempo de execução através do Application_PreSendRequestHeadersevento in Global.asax.cs. Isso é útil se os valores do cabeçalho forem dinâmicos:

protected void Application_PreSendRequestHeaders(object source, EventArgs e)
{
      Response.Headers.Remove("foo");
      Response.Headers.Add("bar", "quux");
}
RedFilter
fonte
4
+1 - pelo interesse, 1) Por que você faria? 2) Tem algum efeito adverso?
BritishDeveloper 5/08
69
Você faz isso por razões de segurança para ofuscar qual tecnologia você usa para gerar suas páginas da web. Isso força os hackers a trabalhar um pouco mais.
RedFilter
20
@BritishDeveloper Essa foi uma recomendação que saiu de uma revisão de segurança. Eu acho que é uma prática recomendada não anunciar sua pilha de tecnologias, porque isso ajuda os hackers a segmentar vulnerabilidades específicas com essa plataforma.
Paul Fryer
1
@RedFilter Obrigado por sua resposta rápida e detalhada!
Paul Fryer
6
No IIS 8, isso não remove o X-Powered-Bycabeçalho. Veja outras respostas sobre como conseguir isso em web.config.
Knelis
105

Você também pode removê-los adicionando código ao seu arquivo 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
fonte
29
No meu caso, apenas os três últimos funcionaram, para "X-Powered-By" eu ainda precisava<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
Frank van Eykelen
2
No meu caso, nenhum dos cabeçalhos acima foi removido. Estou usando .net 4.0 e IIS 7. Graças a outros comentários neste tópico. Eu consegui remover todos os cabeçalhos indesejados, com exceção do "Servidor", que é o pior caso.
Farjad
2
Funciona nos arquivos / imagens / etc de conteúdo que não estão passando pelo caminho do 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
estranho para alguém que "PreSendRequestHeaders" é realmente pré enviar cabeçalhos de resposta?
JDPeckham
50

Eu encontrei essa configuração no meu web.configque era para um New Web Site...criado no Visual Studio (em oposição a New Project...). Como a pergunta indica um aplicativo ASP.NET MVC, não é relevante, mas ainda é uma opção.

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

Atualização : Além disso, Troy Hunt tem um artigo intitulado Shhh… não deixe seus cabeçalhos de resposta falar alto demais com etapas detalhadas sobre a remoção desses cabeçalhos, bem como um link para sua ferramenta ASafaWeb para digitalizá-los e outras configurações de segurança.

Kevin Hakanson
fonte
5
A melhor opção, mas requer o iis7 + Você não precisa <limpá-los /> ... remover é o suficiente .. também é possível adicionar isso ao system.webserver para remover outra vulnerabilidade: code <security> <requestFiltering> <verbs> <add verb = "OPTIONS" allowed = "false" /> </verbs> </requestFiltering> </security>code
felickz
Eu acho que o elemento <clear /> limpa todos os cabeçalhos, incluindo o 'X-Powererd-By', então o elemento <remove /> é redundante.
Jan H
33

.NET Core

Para remover o cabeçalho do servidor , no arquivo Program.cs , adicione a seguinte opção:

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

Para o dot net core 1, adicione a opção na chamada .UseKestrel (). Para dot net core 2, adicione a linha após UseStartup ().

Para remover o cabeçalho X-Powered-By , se implantado no IIS, edite seu web.config e adicione a seguinte seção na tag system.webServer:

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

.NET 4.5.2

Para remover o cabeçalho do servidor , no arquivo global.asax, adicione o seguinte:

    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

Adicione a seguinte classe c # ao seu projeto:

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

e, em seu web.config, adicione a seguinte seção <modules>:

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

No entanto, tive um problema em que os subprojetos não conseguiram encontrar este módulo. Não tem graça.

Removendo o cabeçalho X-AspNetMvc-Version

Para remover a tag '' X-AspNetMvc-Version '', para qualquer versão do .NET, modifique o arquivo '' web.config '' para incluir:

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

Obrigado à Microsoft por tornar isso incrivelmente difícil. Ou talvez essa fosse sua intenção, para que você pudesse acompanhar as instalações do IIS e MVC em todo o mundo ...

Rocklan
fonte
3
Nos dias de hoje, isso é considerado uma "pior prática" e é difícil acreditar que a Microsoft ainda torne "inseguro" o padrão e tão complicado optar por "proteger". Isso me lembra de como o Windows oculta as extensões de arquivo comuns por padrão, para que usuários inocentes cliquem em vírus. Eu me lembro de Bill Gates anunciando "seguro por padrão" em 2003 - o que aconteceu com essa idéia?
mike nelson
2
@mikenelson Se isso faz você se sentir melhor, tentar remover a tag Server no nginx é igualmente difícil - acabei tendo que invadir o próprio código-fonte.
Rocklan 19/10/19
Sobre RemoveServerHeaderModuleisso não vai funcionar no projeto WebApi.
Krypru
32

Conforme descrito em Cloaking your ASP.NET MVC Web Application no IIS 7 , você pode desativar o cabeçalho X-AspNet-Version aplicando a seguinte seção de configuração ao seu web.config:

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

e remova o cabeçalho X-AspNetMvc-Version alterando seu Global.asax.cs da seguinte maneira:

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

Conforme descrito em Cabeçalhos personalizados Você pode remover o cabeçalho "X-Powered-By" aplicando a seguinte seção de configuração ao seu web.config:

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

Não há uma maneira fácil de remover o cabeçalho de resposta "Servidor" por meio da configuração, mas você pode implementar um HttpModulepara remover cabeçalhos HTTP específicos, conforme descrito em Encobrindo seu aplicativo Web do ASP.NET MVC no IIS 7 e em como remover o servidor- x-aspnet-version-x-aspnetmvc-version-e-x-powered by-the-response-header-in-iis7 .

RonyK
fonte
Usando a resposta bkaid, sou capaz de remover o cabeçalho "Servidor". IIS 8.
tmorell
A resposta do bkaid é boa, mas requer codificação, então achei a solução que descrevi como mais conveniente, pois é baseada em configuração.
RonyK 14/07
8

Conforme mostrado em Removendo cabeçalhos de servidor padrão na página Sites do Windows Azure , você pode remover cabeçalhos com o seguinte:

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

Isso remove o cabeçalho do servidor e os cabeçalhos X.

Isso funcionou localmente nos meus testes no Visual Studio 2015.

Eric Dunaway
fonte
6
A adição de removeServerHeader = "true" deu-me um erro 500 no meu aplicativo ASP.NET 4.5.3
Rocklan
4
@LachlanB foi adicionado no IIS 10: O IIS 10.0 adicionou o atributo removeServerHeader para suprimir o envio do cabeçalho do servidor HTTP para clientes remotos. Fonte: iis.net/configreference/system.webserver/security/…
SynerCoder
1
Eu amo que a página do Azure forneça capturas de tela em vez de blocos de código. Eles literalmente fazem tudo o que podem para tornar a remoção dessas tags desnecessárias e potencialmente perigosas o mais difícil possível. Além disso, não acredito que estou fazendo referência a uma pergunta SO de três anos para corrigir esse problema, o que não mostra sinais de correção.
Killa-byte
1
Eu acho que este Web.config não remove o cabeçalho X-AspNetMvc-Version. Para remover esse, precisamos adicionar algo no Global.asax stackoverflow.com/a/20739875/1678525
Jan H
8

No Asp.Net Core, você pode editar os arquivos web.config da seguinte forma:

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

Você pode remover o cabeçalho do servidor nas opções do Kestrel:

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

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

Minha opinião sobre isso:

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

Por uma questão de integridade, existe outra maneira de remover o Servercabeçalho, usando o regedit.

Veja este blog do MSDN .

Crie uma entrada DWORD chamada DisableServerHeader na seguinte chave do Registro e defina o valor como 1.

HKLM \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parameters

Prefiro encontrar uma solução adequada usando o Web.config, mas o uso <rewrite>não é bom porque requer a instalação do módulo de reescrita e, mesmo assim, ele não remove o cabeçalho, apenas o esvazia.

Rudey
fonte
Se isso funcionar, parece uma boa solução para o meu caso. Eu tenho 30 sites em versões diferentes do .net e, portanto, precisaria de três maneiras diferentes de remover os cabeçalhos e atualizar o código em todos esses sites. Prefiro ter uma configuração ou registro do que modificar o código.
mike nelson
Eu apliquei isso com sucesso há dois dias, funciona muito bem.
Rudey
2

Você pode alterar qualquer cabeçalho ou qualquer coisa ao Application_EndRequest()tentar isso

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

O cabeçalho X-Powered-By é adicionado pelo IIS à resposta HTTP, para que você possa removê-lo mesmo no nível do servidor via Gerenciador do IIS:

Você pode usar o web.config diretamente:

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