Jak usunąć domyślne nagłówki HTTP ASP.Net MVC?

176

Każda strona w aplikacji MVC, z którą pracuję, ustawia następujące nagłówki HTTP w odpowiedziach:

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

Jak mogę zapobiec ich wyświetlaniu?

Paul Fryer
źródło
2
Zapoznaj się z tym artykułem Usuwanie niepotrzebnych nagłówków HTTP w usługach IIS i ASP.NET , w którym opisano, jak usunąć wszystkie wymienione nagłówki.
Pavel Morshenyuk,
@PavelMorshenyuk Przepraszam, czy znalazłeś sposób na usunięcie również nazwy serwera? zaakceptowana odpowiedź nie usuwa serwera
neda Derakhshesh

Odpowiedzi:

285

X-Powered-Byto niestandardowy nagłówek w usługach IIS. Od wersji IIS 7 można je usunąć, dodając następujące elementy do web.config:

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

Ten nagłówek można również zmodyfikować zgodnie ze swoimi potrzebami. Więcej informacji można znaleźć pod adresem http://www.iis.net/ConfigReference/system.webServer/httpProtocol/customHeaders


Dodaj to do, web.configaby pozbyć się X-AspNet-Versionnagłówka:

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

Na koniec, aby usunąć X-AspNetMvc-Version, edytować Global.asax.csi dodać następujące elementy w Application_Startwydarzeniu:

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

Możesz także modyfikować nagłówki w czasie wykonywania za pośrednictwem Application_PreSendRequestHeaderszdarzenia w Global.asax.cs. Jest to przydatne, jeśli wartości nagłówka są dynamiczne:

protected void Application_PreSendRequestHeaders(object source, EventArgs e)
{
      Response.Headers.Remove("foo");
      Response.Headers.Add("bar", "quux");
}
RedFilter
źródło
4
+1 - Ze względu na zainteresowanie, 1) Dlaczego miałbyś to zrobić? 2) Czy ma jakikolwiek niekorzystny wpływ?
BritishDeveloper,
69
Robisz to ze względów bezpieczeństwa, aby zaciemnić technologię używaną do generowania stron internetowych. To zmusza hakerów do cięższej pracy.
RedFilter,
20
@BritishDeveloper To była rekomendacja wynikająca z przeglądu bezpieczeństwa. Wydaje mi się, że najlepszą praktyką jest nie reklamowanie stosu technologii, ponieważ pomaga to hakerom atakować określone luki w tej platformie.
Paul Fryer
1
@RedFilter Dziękujemy za szybką i szczegółową odpowiedź!
Paul Fryer
6
W usługach IIS 8 nie powoduje to usunięcia X-Powered-Bynagłówka. Zobacz inne odpowiedzi, jak to osiągnąć, w web.config.
Knelis
105

Możesz je również usunąć, dodając kod do pliku 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
źródło
29
W moim przypadku tylko trzy ostatnie działały, dla "X-Powered-By" nadal potrzebowałem<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
Frank van Eykelen
2
W moim przypadku żaden z powyższych nagłówków nie został usunięty. Używam .net 4.0 i IIS 7. Dzięki innym komentarzom w tym wątku. Udało mi się usunąć wszystkie niechciane nagłówki z wyjątkiem „Server”, który jest najgorszym przypadkiem.
Farjad
2
Czy działa w przypadku plików z treścią / obrazów / itp., Które nie przechodzą przez ścieżkę kodu?
Mark Sowul
co umieściłeś w "serwerze"? czy tak powinno być? Response.Headers.Remove ("Serwer: Microsoft-IIS / 7.0"); ? czy powinno to być „Serwer”? proszę o pomoc
neda Derakhshesh
dziwne dla nikogo innego, że „PreSendRequestHeaders” jest w rzeczywistości nagłówkami odpowiedzi przed wysłaniem?
JDPeckham
50

Znalazłem tę konfigurację w mojej, web.configktóra była dla New Web Site...utworzonego w Visual Studio (w przeciwieństwie do a New Project...). Ponieważ pytanie stanowi aplikację ASP.NET MVC, nie jest tak istotna, ale nadal jest opcją.

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

Aktualizacja : Troy Hunt ma również artykuł zatytułowany Shhh… nie pozwól, aby nagłówki odpowiedzi mówiły zbyt głośno, przedstawiając szczegółowe kroki dotyczące usuwania tych nagłówków, a także łącze do jego narzędzia ASafaWeb do skanowania w poszukiwaniu ich i innych konfiguracji zabezpieczeń.

Kevin Hakanson
źródło
5
Najlepsza opcja, ale wymaga iis7 + Nie musisz ich <wyczyścić /> ... wystarczy usunąć .. również możesz chcieć dodać to do system.webserver, aby usunąć kolejną lukę: code <security> <requestFiltering> <verbs> <add verb = "OPTIONS" allowed = "false" /> </verbs> </requestFiltering> </security>code
felickz
Myślę, że element <clear /> czyści wszystkie nagłówki, w tym „X-Powererd-By”, więc element <remove /> jest zbędny.
Jan H
33

.NET Core

Aby usunąć nagłówek serwera , w pliku Program.cs dodaj następującą opcję:

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

Dla dot net core 1, wstaw opcję add wewnątrz wywołania .UseKestrel (). W przypadku dot net core 2 dodaj wiersz po UseStartup ().

Aby usunąć nagłówek X-Powered-By , jeśli został wdrożony w usługach IIS, edytuj plik web.config i dodaj następującą sekcję w tagu system.webServer:

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

.NET 4.5.2

Aby usunąć nagłówek serwera , w pliku global.asax dodaj następujące elementy:

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

    }

Przed .NET 4.5.2

Dodaj następującą klasę C # do projektu:

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

a następnie w swoim web.config dodaj następującą sekcję <modules>:

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

Jednak miałem problem, w którym podprojekty nie mogły znaleźć tego modułu. Nie śmieszne.

Usuwanie nagłówka X-AspNetMvc-Version

Aby usunąć znacznik „X-AspNetMvc-Version” dla dowolnej wersji platformy .NET, zmodyfikuj plik „web.config”, aby zawierał:

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

Dziękuję firmie Microsoft za uczynienie tego niewiarygodnie trudnym. A może taki był Twój zamiar, abyś mógł śledzić instalacje IIS i MVC na całym świecie ...

Rocklan
źródło
3
W dzisiejszych czasach jest to uważane za „najgorszą praktykę” i trudno uwierzyć, że Microsoft nadal uważa „niepewny” za domyślny i tak trudno jest zdecydować się na „bezpieczny”. Przypomina mi, jak system Windows domyślnie ukrywa popularne rozszerzenia plików, aby niczego nie podejrzewający użytkownicy klikali wirusy. Wydaje mi się, że Bill Gates ogłosił w 2003 roku „domyślne zabezpieczenie” - co się stało z tym pomysłem?
mike nelson
2
@mikenelson, jeśli poczujesz się lepiej, próba usunięcia tagu serwera w nginx jest równie trudna - skończyło się na tym, że musiałem zhakować sam kod źródłowy.
Rocklan
O RemoveServerHeaderModuletym, że to nie zadziała w projekcie WebApi.
krypru
32

Zgodnie z opisem w sekcji Maskowanie aplikacji sieci Web ASP.NET MVC w usługach IIS 7 można wyłączyć nagłówek X-AspNet-Version, stosując następującą sekcję konfiguracji do pliku web.config:

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

i usuń nagłówek X-AspNetMvc-Version, zmieniając plik Global.asax.cs w następujący sposób:

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

Zgodnie z opisem w nagłówkach niestandardowych Nagłówek „X-Powered-By” można usunąć, stosując następującą sekcję konfiguracji do pliku web.config:

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

Nie ma łatwego sposobu na usunięcie nagłówka odpowiedzi „Server” poprzez konfigurację, ale można zaimplementować, HttpModuleaby usunąć określone nagłówki HTTP, zgodnie z opisem w artykule Maskowanie aplikacji sieci Web ASP.NET MVC w usługach IIS 7 oraz w instrukcji usuwania serwera x-aspnet-version-x-aspnetmvc-version-and-x-powered-by-from-the-response-header-in-iis7 .

RonyK
źródło
Używając odpowiedzi bkaid, mogę usunąć nagłówek „Server”. IIS 8.
tmorell
bkaid odpowiedź jest w porządku, ale wymaga kodowania, więc rozwiązanie, które opisałem jako wygodniejsze, ponieważ jest oparte na konfiguracji.
RonyK
8

Jak pokazano na stronie Usuwanie standardowych nagłówków serwera na stronie Witryny sieci Web systemu Windows Azure , nagłówki można usunąć, wykonując następujące czynności:

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

Spowoduje to usunięcie nagłówka serwera i nagłówków X.

To zadziałało lokalnie w moich testach w programie Visual Studio 2015.

Eric Dunaway
źródło
6
Dodanie removeServerHeader = "true" spowodowało błąd 500 w mojej aplikacji ASP.NET 4.5.3
Rocklan,
4
@LachlanB dodano to w IIS 10: IIS 10.0 dodał atrybut removeServerHeader w celu pominięcia wysyłania nagłówka serwera HTTP do klientów zdalnych. Źródło: iis.net/configreference/system.webserver/security/…
SynerCoder
1
Podoba mi się to, że strona platformy Azure zawiera zrzuty ekranu, a nie bloki kodu. Dosłownie robią wszystko, co w ich mocy, aby usuwanie tych niepotrzebnych i potencjalnie niebezpiecznych tagów było tak trudne, jak to tylko możliwe. Nie mogę też uwierzyć, że odwołuję się do pytania SO sprzed trzech lat, aby rozwiązać ten problem, który nie wykazuje żadnych oznak poprawy.
killa-byte
1
Myślę, że ten plik Web.config nie usuwa nagłówka X-AspNetMvc-Version. Aby to usunąć, musimy dodać coś w pliku Global.asax stackoverflow.com/a/20739875/1678525
Jan H
8

W Asp.Net Core możesz edytować pliki web.config w następujący sposób:

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

Możesz usunąć nagłówek serwera w opcjach Kestrel:

            .UseKestrel(c =>
            {
                // removes the server header
                c.AddServerHeader = false;
            }) 
Darxtar
źródło
5

Sprawdź ten blog Nie używaj kodu do usuwania nagłówków. Według Microsoft jest niestabilny

Moje podejście do tego:

<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
źródło
4

Ze względu na kompletność istnieje inny sposób usunięcia Servernagłówka za pomocą regedit.

Zobacz ten blog MSDN .

Utwórz wpis DWORD o nazwie DisableServerHeader w następującym kluczu rejestru i ustaw wartość na 1.

HKLM \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parameters

Wolałbym znaleźć właściwe rozwiązanie przy użyciu Web.config, ale używanie <rewrite>nie jest dobre, ponieważ wymaga zainstalowania modułu przepisywania, a nawet wtedy tak naprawdę nie usunie nagłówka, po prostu go opróżni.

Rudey
źródło
Jeśli to zadziała, brzmi to jak dobre rozwiązanie w moim przypadku. Mam 30 witryn w różnych wersjach .net, więc potrzebowałbym 3 różnych sposobów usuwania nagłówków i aktualizacji kodu we wszystkich tych witrynach. Wolałbym mieć ustawienie konfiguracyjne lub rejestr, niż modyfikować kod.
mike nelson
Zastosowałem to z powodzeniem dwa dni temu, działa świetnie.
Rudey
2

Możesz zmienić dowolny nagłówek lub cokolwiek Application_EndRequest()próbując tego

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

Nagłówek X-Powered-By jest dodawany przez IIS do odpowiedzi HTTP, dzięki czemu można go usunąć nawet na poziomie serwera za pośrednictwem Menedżera IIS:

Możesz bezpośrednio użyć pliku web.config:

<system.webServer>
   <httpProtocol>
     <customHeaders>
       <remove name="X-Powered-By" />
     </customHeaders>
   </httpProtocol>
</system.webServer>
Mahesh Sdsraju
źródło