Remover cabeçalho de resposta do servidor IIS7

107

Existe alguma maneira de remover o cabeçalho de resposta "Servidor" do IIS7? Existem alguns artigos mostrando que usando HttpModules podemos conseguir o mesmo. Isso será útil se não tivermos direito de administrador ao servidor. Também não quero escrever filtro ISAPI.

Tenho direitos de administrador no meu servidor. Portanto, não quero fazer as coisas acima. Então, por favor, me ajude a fazer o mesmo.

user247702
fonte
Veja: stackoverflow.com/questions/22401219/…
Mohsen Tavoosi محسن طاوسی

Respostas:

111

Adicione isso ao seu global.asax.cs:

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}
bkaid
fonte
11
Não sei por que a resposta do módulo http é maior do que este, este é muito mais fácil
jjxtra
2
Você pode descobrir que consegue um NullReferenceExceptionna Cassini se confiar em HttpContext.Current. Esta postagem de blog mostra como fazer isso evitando interromper o suporte da Cassini, se isso for importante para você.
Owen Blacker
49
@PsychoDad funciona somente para solicitações ASP.NET, não para arquivos estáticos como .css e .js
Max Toro
1
Para se livrar do cabeçalho MVC, você pode fazer isso MvcHandler.DisableMvcResponseHeader = true;
ProVega de
7
Não é uma boa ideia usar o PreSendRequestHeadersem uma classe que implemente IHttpModuleou Global.asax. Eu testemunhei o evento de congelamento do aplicativo no servidor sob carga de estresse. O BeginRequestevento deve funcionar para fazer alterações no cabeçalho da resposta. Consulte hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx .
Dmitry S.
77

No IIS7, você deve usar um módulo HTTP. Construa o seguinte como uma biblioteca de classes no 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");
    }
  }
}

Em seguida, adicione o seguinte ao seu web.config ou configure-o no IIS (se você configurar no IIS, o assembly deve estar no GAC).

<configuration>
  <system.webServer>
    <modules>
      <add name="CustomHeaderModule"
       type="StrongNamespace.HttpModules.CustomHeaderModule" />
    </modules>
  </system.webServer>
</configuration>
lukiffer
fonte
Excelente, também posso ajustar isso para remover o cabeçalho ETag do meu farm de servidores.
devstuff de
Isso causa um erro de tempo de execução no casini ... / Servidor ASP.NET Dev
UpTheCreek
2
@UpTheCreek O servidor de desenvolvimento ASP.Net (Cassini) não gostará desse código; esta postagem de blog tem uma solução para isso - você precisa verificar se o HttpApplication, o HttpRequest, o HttpContexte o HttpResponsenão estão null, bem como verificar se HttpRequest.IsLocalestão false.
Owen Blacker
2
Como modificar o cabeçalho PreSendRequestHeaderspode causar problemas com o HttpCacheModule , você deve usar algo como PostReleaseRequestState.
Eirik H
5
O módulo não é chamado quando o IIS envia o cabeçalho 304 Not Modified para arquivos estáticos (css / less / images / etc), pois isso não alcança o pipeline ASP.NET, portanto, nesta situação Servidor: Microsoft IIS / 7.5 ainda é renderizado
Jano
42

Com o URL Rewrite Module Versão 2.0 para IIS (UrlRewrite) habilitado, na seção de configuração <configuration><system.webServer><rewrite>adicione a regra de saída:

<outboundRules>
  <rule name="Remove RESPONSE_Server" >
    <match serverVariable="RESPONSE_Server" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>
JeffZhnn
fonte
11
Observe que isso apenas deixa o cabeçalho do servidor em branco, não o remove.
Nick Evans,
Desculpem a ignorância, mas em que parte devo adicionar isso?! Tentei adicioná-lo dentro de <system.webServer>
Vignesh Subramanian
1
Obrigado! Funciona no IIS 8.5, isso é tão fácil. Não tenho um editor de texto, mas você pode usar a GUI facilmente. O nome deve ser RESPONSE_Server, não apenas Server (foi aqui que falhei no início).
Louis Matthijssen
isso é bom o suficiente se você tiver um aplicativo não ASP.Net; portanto, você não pode remover o cabeçalho do servidor com os códigos mencionados
mhesabi
4
@vignesh estes são alguns subnós de configuração UrlRewrite. Você tem que colocá-los sob um rewritenó em system.webServer. Cuidado, isso travará seu site se UrlRewrite não estiver instalado no servidor. E é melhor você usar o console de configuração do IIS primeiro para verificar como ele escreve esses nós de configuração.
Frédéric
36

Scott Mitchell fornece em uma postagem de blog soluções para remover cabeçalhos desnecessários .

Como já foi dito aqui em outras respostas, para o Servercabeçalho, existe a solução do módulo http , ou uma solução web.config para IIS 10+ , ou você pode usar URLRewrite para apagá-lo .

A solução mais prática para uma configuração atualizada (IIS 10 +) é usar removeServerHeadero web.config:

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

Para X-AspNet-Versione X-AspNetMvc-Version, ele fornece uma maneira melhor do que removê-los em cada resposta: simplesmente não gerá-los de forma alguma.

Use enableVersionHeaderpara desativar X-AspNet-Version, em web.config

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

Use MvcHandler.DisableMvcResponseHeaderno evento .Net Application_Start para desabilitarX-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true;

E, finalmente, remova na configuração do IIS o X-Powered-Bycabeçalho personalizado em web.config.

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

Cuidado, se você tiver ARR (Application Request Routing), ele também adicionará o seu próprio X-Powered-By, que não será removido pelas configurações de cabeçalhos personalizados. Este deve ser removido através do Gerenciador do IIS, configuração do Editor na raiz do IIS (não em um site): vá para o system.webServer/proxynó e defina arrResponseHeadercomo false. Após um IISReset, ele é levado em consideração.
(Eu encontrei este aqui , exceto que esta postagem é sobre a maneira antiga do IIS 6.0 de configurar as coisas.)

Não se esqueça de que a solução por código de aplicativo não se aplica por padrão ao cabeçalho gerado em conteúdo estático (você pode ativar o runAllManagedModulesForAllRequestspara alterar isso, mas faz com que todas as solicitações executem o pipeline .Net). Não é um problema, X-AspNetMvc-Versionpois não é adicionado ao conteúdo estático (pelo menos se a solicitação estática não for executada no pipeline .Net).

Nota lateral: quando o objetivo é encobrir a tecnologia usada, você também deve alterar os nomes dos cookies .Net padrão ( .ASPXAUTHse a autenticação de formulários estiver ativada (use o nameatributo na formstag em web.config), ASP.NET_SessionId(use <sessionState cookieName="yourName" />em web.config na system.webtag), __RequestVerificationToken(altere-o por código com AntiForgeryConfig.CookieName, mas infelizmente não se aplica à entrada oculta que este sistema gera no html)).

Frédéric
fonte
18

Na verdade, os módulos codificados e os exemplos Global.asax mostrados acima funcionam apenas para solicitações válidas.

Por exemplo, adicione <no final do seu URL e você obterá uma página de "Solicitação inválida" que ainda expõe o cabeçalho do servidor. Muitos desenvolvedores ignoram isso.

As configurações de registro mostradas também não funcionam. URLScan é a ÚNICA maneira de remover o cabeçalho do "servidor" (pelo menos no IIS 7.5).

Dan Ware
fonte
Ele está funcionando para mim com o módulo codificado (adicionado em web.config) mesmo em uma solicitação incorreta;) Em global.asax, ele não está realmente funcionando (por exemplo, arquivos estáticos etc.)
kapsiR
Esperamos que você ainda tenha a validação de solicitação ativada.
Dan Ware
1
Alguém tem uma alternativa ao urlscan para IIS 8+?
herostwist de
Há uma solução de trabalho pelo menos no IIS10 +: stackoverflow.com/a/53222967/1671558
Ilya Chernomordik
16

Ou adicione 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
fonte
3
Este método não remove o cabeçalho 'Servidor'. Os outros são removidos.
Pure.Krome
Você pode se livrar do X-Powered-By na configuração dos cabeçalhos de resposta no nível do servidor.
Snowburnt
1
Eu não sei se existe um caso desta forma remove X-AspNet-Versione X-AspNetMvc-Versioncabeçalho. O que sei é que nem sempre funciona assim (se é que funcionou). Veja a resposta @Frederic para uma maneira mais confiável de removê-los.
TheBlueSky
Agora há uma maneira no IIS10 + de remover o cabeçalho do servidor: stackoverflow.com/a/53222946/1671558
Ilya Chernomordik
14

Esta web.configconfiguração funciona para remover todos os cabeçalhos desnecessários da resposta ASP.NET (pelo menos a partir do 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>

Observe que isso oculta todos os cabeçalhos do "aplicativo", assim como todas as outras abordagens. Se você, por exemplo, acessar alguma página padrão ou uma página de erro gerada pelo próprio IIS ou ASP.NET fora de seu aplicativo, essas regras não se aplicarão. Portanto, o ideal é que eles estejam no nível raiz do IIS e isso pode deixar algumas respostas de erro para o próprio IIS.

PS: Há um bug no IIS 10 que às vezes o faz mostrar o cabeçalho do servidor, mesmo com a configuração correta. Já deve estar corrigido, mas o IIS / Windows precisa ser atualizado.

Ilya Chernomordik
fonte
12

Além da resposta de reescrita de URL , aqui está o 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>

URL Rewrite

Vaibhav Garg
fonte
Isso remove todas as versões IIS e ASP do hacker
aggie
1
A correção acima está funcionando corretamente para as páginas da web. Mas para imagens / ícones, se ocorrer 500 Erro Interno do Servidor, ele mostra o Servidor: Microsoft-IIS / 7.5 em vez do valor. Você pode me ajudar nisso
ravithejag
11

Para remover o Server:cabeçalho, acesse Global.asax, encontre / crie o Application_PreSendRequestHeadersevento e adicione uma linha da seguinte forma (graças a BK e a este blog isso também não irá falhar no Cassini / dev 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");
        }
    }
}

Se você deseja uma solução completa para remover todos os cabeçalhos relacionados no Azure / IIS7 e também funciona com a Cassini, consulte este link , que mostra a melhor maneira de desabilitar esses cabeçalhos sem usar HttpModules ou URLScan.

Nick Evans
fonte
9

Se você deseja apenas remover o cabeçalho, pode usar uma versão abreviada da resposta 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");
        }
    }
}

E então em Web.config:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHeaderModule" type="Site.HideServerHeaderModule" />
  </modules>
</system.webServer>
Drew Noakes
fonte
1
Isso é mais apropriado porque recursos como css / js não terão o cabeçalho do servidor, ele portará de servidor para servidor sem configuração e o cabeçalho de resposta do servidor não estará apenas vazio, ele não será enviado.
Adam Caviness
Eu vi comentários que runAllManagedModulesForAllRequests = "true" tornará seu aplicativo lento e não é recomendado. Em vez disso, pode-se usar o módulo urlrewrite outboundRules para limpar o valor do servidor também para arquivos estáticos. britishdeveloper.co.uk/2010/06/…
Juri
5

Tente definir a HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeaderentrada do registro como REG_DWORDde 1.

Richard Deeming
fonte
Tive uma situação estranha em nosso farm de servidores, em que essa configuração de registro parece ser a única alteração que funciona em todos os sistemas operacionais (W2K8, W2K3) que estamos usando, tanto para IIS6 quanto para IIS7.
jerhewet
2
Frustrantemente, isso não está fazendo nenhuma diferença para mim, mesmo depois de reiniciar a máquina virtual. Estamos executando o IIS 7.5 no Windows Server 2008 R2 Standard, "Versão 6.1 (Build 7601: Service Pack 1)". Da mesma forma, meu OnPreSendRequestHeadersmanipulador de eventos (veja acima) nunca está disparando, por algum motivo.
Owen Blacker
3
Infelizmente, a chave de registro não parece funcionar no IIS 7.5
Andrew Csontos
4

O UrlScan também pode remover o cabeçalho do servidor usando AlternateServerName=sob [options].

Eddiegroves
fonte
2

Seguindo a resposta de eddiegroves , dependendo da versão do URLScan, você pode preferir RemoveServerHeader=1em [options].

Não tenho certeza em qual versão do URLScan essa opção foi adicionada, mas ela está disponível na versão 2.5 e posteriores.

técnico
fonte
2

Encontrei um artigo que explica por que precisamos fazer a edição do Registro e usar uma ferramenta como o UrlScan para configurar isso no IIS corretamente. Acompanhei em nossos servidores e funciona: http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx . Se você usar apenas o UrlScan, mas não fizer a alteração do registro, durante o tempo em que estiver interrompendo o World Wide Publishing Service, seu servidor retornará uma resposta http do servidor a partir do arquivo HTTP.sys. Além disso, aqui estão os erros comuns de uso da ferramenta UrlScan: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008

Pawel
fonte
2
Por favor, poste seu código no Stack Overflow. Links podem mudar e quebrar, então postar código é muito mais útil
Blundering Philosopher
2

No IIS 10, usamos uma solução semelhante à abordagem de Drew, ou seja:

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

E, obviamente, adicione uma referência a essa dll em seu (s) projeto (s) e também o módulo na (s) configuração (ões) que você deseja:

<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 IMPORTANTE1: Esta solução precisa de um pool de aplicativos definido como integrado;

NOTA IMPORTANTE2: Todas as respostas dentro do aplicativo da web serão afetadas por isso (css e js incluídos);

xautau
fonte
1

Eu pesquisei isso e o método URLRewrite funciona bem. Parece que não consigo encontrar bem a mudança em nenhum lugar. Eu escrevi isso compatível com PowerShell v2 e superior e testei no 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
fonte
1

Você pode adicionar o código abaixo no arquivo Global.asax.cs

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

A solução proposta acima em combinação funcionou para mim com as seguintes alterações. Aqui estou postando meu cenário e solução.

Para mim, eu queria remover os seguintes cabeçalhos:

  • Servidor
  • X-Powered-By
  • Versão X-AspNet
  • Versão X-AspNetMvc

Eu adicionei isso ao meu 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>

O evento acima não estava sendo disparado, então, para isso, adicionei o seguinte ao web.config e funcionou.

<modules runAllManagedModulesForAllRequests="true" />

e para remover o cabeçalho da versão, também adicionei o seguinte ao web.config:

<httpRuntime enableVersionHeader="false" />

Mudanças no 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 que ajude!

Zaki Mohammed
fonte
0

Eu tentei todas as coisas aqui e em vários outros threads de estouro de pilha semelhantes.

Eu fiquei um pouco travado porque esqueci de limpar o cache do meu navegador depois de fazer alterações na configuração. Se você não fizer isso e o arquivo estiver em seu cache local, ele o servirá de volta para você com os cabeçalhos originais (duh).

Consegui principalmente ao remover runAllManagedModulesForAllRequests:

<modules runAllManagedModulesForAllRequests="true">

Isso removeu os cabeçalhos estranhos da maioria dos arquivos estáticos, mas eu ainda estava obtendo o cabeçalho "Servidor" em alguns arquivos estáticos em meu projeto WebAPI com arrogância.

Finalmente encontrei e apliquei esta solução e agora todos os cabeçalhos indesejados se foram:

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

que discute seu código que está aqui:

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

Este é um módulo Native-Code. É capaz de remover o cabeçalho do servidor, não apenas apagar o valor. Por padrão, ele remove:

  • Servidor
  • X-Powered-By
  • Versão X-Aspnet
  • Servidor: Microsoft-HTTPAPI / 2.0 - que seria retornado se "a solicitação não fosse passada ao IIS"
TechSavvySam
fonte
-1

IIS 7.5 e, possivelmente, versões mais recentes têm o texto do cabeçalho armazenado em iiscore.dll

Usando um editor hexadecimal, encontre a string e a palavra "Servidor" 53 65 72 76 65 72depois dela e substitua-as por bytes nulos. No IIS 7.5, é assim:

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 

Ao contrário de alguns outros métodos, isso não resulta em uma penalidade de desempenho. O cabeçalho também é removido de todas as solicitações, mesmo de erros internos.

3dcdr
fonte