Usuwanie / ukrywanie / wyłączanie nadmiernych nagłówków odpowiedzi HTTP w Azure / IIS7 bez UrlScan

86

Muszę usunąć nadmierne nagłówki (przede wszystkim, aby przejść testy penetracyjne). Spędziłem czas na szukaniu rozwiązań obejmujących uruchamianie UrlScan, ale są one uciążliwe, ponieważ UrlScan musi być instalowany za każdym razem, gdy uruchamiana jest instancja platformy Azure .

Musi istnieć dobre rozwiązanie dla platformy Azure, które nie obejmuje wdrażania instalatorów z pliku startup.cmd.

Rozumiem, że nagłówki odpowiedzi są dodawane w różnych miejscach :

  • Serwer : dodany przez IIS.
  • Wersja X-AspNet : dodana przez System.Web.dll w czasie Flush w klasie HttpResponse
  • Wersja X-AspNetMvc : Dodana przez MvcHandler w System.Web.dll.
  • X-Powered-By : dodany przez IIS

Czy istnieje sposób skonfigurowania (za pośrednictwem web.config itp.) Usług IIS7 w celu usunięcia / ukrycia / wyłączenia nagłówków odpowiedzi HTTP w celu uniknięcia ostrzeżenia „Nadmiar nagłówków” w witrynie asafaweb.com bez tworzenia modułu IIS lub wdrażania instalatorów, które muszą być uruchamiane przy każdym uruchomieniu wystąpienia platformy Azure?

Nick Evans
źródło

Odpowiedzi:

139

Poniższe zmiany umożliwiają usunięcie tych nagłówków odpowiedzi HTTP na platformie Azure bez pisania niestandardowego HttpModule.

Większość informacji w sieci jest nieaktualna i dotyczy UrlScan (który od tego czasu został zintegrowany z IIS7, ale z RemoveServerHeader=1usuniętą opcją). Poniżej znajduje się najładniejsze rozwiązanie, jakie znalazłem (dzięki temu blogowi , ta odpowiedź i ten blog w połączeniu).

Aby usunąć serwer , przejdź do Global.asax, znajdź / utwórz Application_PreSendRequestHeaderswydarzenie i dodaj następujące (dzięki BK i temu blogowi to również nie zawiedzie na Cassini / local dev):

Edytowane w kwietniu 2014 r .: można używać zdarzeń PreSendRequestHeaders i PreSendRequestContext z natywnymi modułami usług IIS, ale nie można ich używać z modułami zarządzanymi, które implementują IHttpModule. Ustawienie tych właściwości może powodować problemy z żądaniami asynchronicznymi . Poprawna wersja to użycie zdarzenia 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");
        }
    }

Aby usunąć wersję X-AspNet , w pliku web.config znajdź / utwórz <system.web>i dodaj:

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

    ...

Aby usunąć X-AspNetMvc-Version , przejdź do Global.asax, znajdź / utwórz Application_Startzdarzenie i dodaj linię w następujący sposób:

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

Aby usunąć X-Powered-By , w pliku web.config znajdź / utwórz <system.webServer>i dodaj:

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

    ...
Nick Evans
źródło
Zgodnie z podpowiedzią w VS, nie ma potrzeby zerowania zaznaczania Request, Response lub Response. Headers
Chris Haines
1
W przypadku korzystania z usług IIS, a nie platformy Azure, należy pamiętać, że pula aplikacji musi być w trybie zintegrowanym. I .IsLocal powinien zostać usunięty podczas debugowania lokalnego.
IvanH
5
Nie ma potrzeby stosowania „warunków Yoda” w C # - nie zezwala na przypisanie warunkowe, en.wikipedia.org/wiki/Yoda_Conditions
tvanfosson
1
Dziękuję za szczegółową odpowiedź, jednak próbowałem wykonać kroki, ale za każdym razem, gdy skanuję witrynę za pomocą asafweb, nadal wspomina o problemie z nadmiernym nagłówkiem (X-AspNet-Version). Użyłem nawet URLRewrite, aby usunąć ten nagłówek. Czy są jakieś inne możliwości jego usunięcia?
Raymond A
4
Nadal występuje problem z żądaniem nieistniejącego pliku, np. „ Twoja_witryna / foo.jpg ”. Ponieważ to żądanie nie jest przetwarzane przez MVC, nagłówek odpowiedzi „Server: IIS xy” nadal tam będzie. Jednym z rozwiązań, które działa w przypadku witryn sieci Web platformy Azure (i najwyraźniej TYLKO w przypadku witryn sieci Web Azure) jest dodanie tego w obszarze <system.webServer>: <security xdt: Transform = "Insert"> <requestFiltering removeServerHeader = "true" /> </ security >
adrian h.
12

Witryna MSDN opublikowała ten artykuł na temat ukrywania nagłówków w witrynach sieci Web platformy Azure. Możesz teraz ukryć serwer przed web.config, dodając wpis do system.webServer

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

VS zmarszczy brwi, widząc powyższe jako nieważne. Powyższy link zawiera kod w postaci fotek, trudny do znalezienia. Wersja MVC jest nadal ukryta w starcie aplikacji, jak powyżej, tak samo dla wersji x-powered-by i .Net.

AKhooli
źródło
3
To jest dokładnie to , czego szukałem. Dziękuję Ci.
Martin Costello
3
Może to działać na platformie Azure, ale nie nigdzie indziej. Potwierdzają to komentarze do tego artykułu, podobnie jak moje własne testy. Odpowiedź @ giveme5minutes to sposób, w jaki to działa.
CrazyPyro
Byłoby miło wiedzieć, co zostało zaimplementowane, aby ta funkcja: | Zwłaszcza, że ​​URL SCAN wcześniej zaimplementowało to po wyjęciu z pudełka.
felickz
6

W NuGet dostępny jest również pakiet, który pomaga to osiągnąć za pomocą kilku wierszy konfiguracji i bez zmian w kodzie: NWebsec. Dokumentację dotyczącą usuwania nagłówków wersji można znaleźć tutaj: https://github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers

Jest to pokazane tutaj: http://www.nwebsec.com/HttpHeaders/VersionHeaders (na platformie Azure)

Zastrzeżenie: jestem programistą w projekcie.

klings
źródło
„NWebsec pomaga w pomijaniu prawie wszystkich tych nagłówków wersji, tj. Wszystkich oprócz nagłówka Serwer: Microsoft-IIS / 8.0”. :( github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers
felickz
Przeniósł się z codeplex do GitHub (zaktualizuj link github.com/NWebsec/NWebsec/wiki )
Nordes
6

Odpowiedź Nicka Evansa jest doskonała, ale ...

Jeśli usuniesz te nagłówki ze względów bezpieczeństwa , nie zapomnij zmienić ASP.NET Session coockie name! Ponieważ łatwiej jest odgadnąć używany język lub wersję serwera, gdy zobaczysz to:

wprowadź opis obrazu tutaj

Aby zmienić nazwę pliku cookie: (bądź kreatywny)

<system.web>
  <sessionState cookieName="PHPSESSID" />
</system.web>
Matthieu Charbonnier
źródło
Zmiana nazwy pliku cookie daje więcej korzyści niż tylko ujawnienie technologii serwera - np. Zmniejsza ryzyko ogólnego, zbiorczego gromadzenia sesji
mlhDev
4

Podsumowując poprzednie odpowiedzi z @ giveme5minutes i @AKhooli, ponieważ odnoszą się one do Azure Websites oraz kilku innych elementów, które skaner chce zobaczyć, są to zmiany, które wprowadziłem, aby ASafaWeb był zadowolony z witryny Azure.

Nadal narzeka, że ​​plik cookie nagłówka koligacji platformy Azure nie jest tylko https, ale koligacja to typ pliku cookie, który i tak chcesz odtworzyć, prawda?

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