Usuń nagłówek odpowiedzi serwera IIS7

107

Czy istnieje sposób na usunięcie nagłówka odpowiedzi „Server” z usług IIS7? Jest kilka artykułów pokazujących, że używając HttpModules możemy osiągnąć to samo. Będzie to pomocne, jeśli nie mamy uprawnień administratora do serwera. Nie chcę też pisać filtru ISAPI.

Mam uprawnienia administratora do mojego serwera. Więc nie chcę robić powyższych rzeczy. Więc proszę, pomóż mi zrobić to samo.

user247702
źródło
Zobacz: stackoverflow.com/questions/22401219/…
Mohsen Tavoosi محسن طاوسی

Odpowiedzi:

111

Dodaj to do swojego global.asax.cs:

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}
bkaid
źródło
11
Nie wiem, dlaczego odpowiedź modułu http jest wyższa niż ta, ta jest znacznie łatwiejsza
jjxtra
2
Możesz znaleźć się NullReferenceExceptionw Cassini, jeśli polegasz HttpContext.Current. Ten wpis na blogu pokazuje, jak to zrobić, unikając zrywania wsparcia Cassini, jeśli jest to dla Ciebie ważne.
Owen Blacker
49
@PsychoDad Działa to tylko w przypadku żądań ASP.NET, a nie w przypadku plików statycznych, takich jak .css i .js
Max Toro
1
Aby pozbyć się nagłówka MVC, możesz zrobić to MvcHandler.DisableMvcResponseHeader = true;
ProVega
7
Nie jest dobrym pomysłem używanie PreSendRequestHeadersklasy w klasie implementującej IHttpModulelub Global.asax. Byłem świadkiem zdarzenia zawieszającego aplikację na serwerze pod wpływem stresu. BeginRequestWydarzenie powinno działać, aby dokonać zmian nagłówka odpowiedzi. Zobacz hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx .
Dmitry S.
77

W IIS7 musisz użyć modułu HTTP. Zbuduj następujące elementy jako bibliotekę klas w 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");
    }
  }
}

Następnie dodaj następujące elementy do pliku web.config lub skonfiguruj go w usługach IIS (jeśli konfigurujesz w usługach IIS, zestaw musi znajdować się w GAC).

<configuration>
  <system.webServer>
    <modules>
      <add name="CustomHeaderModule"
       type="StrongNamespace.HttpModules.CustomHeaderModule" />
    </modules>
  </system.webServer>
</configuration>
lukiffer
źródło
Świetnie, mogę to również zmienić, aby usunąć nagłówek ETag z całej mojej farmy serwerów.
devstuff,
Powoduje to błąd w czasie wykonywania na serwerze Casini ... / ASP.NET Dev
UpTheCreek
2
@UpTheCreek Serwer deweloperski ASP.Net (Cassini) nie polubi tego kodu; tym blogu ma rozwiązanie do niego, choć - trzeba sprawdzić, czy HttpApplicationThe HttpRequestThe HttpContext, a HttpResponsenie są null, a także sprawdzenie, że HttpRequest.IsLocaljest false.
Owen Blacker
2
Ponieważ modyfikacja nagłówka w PreSendRequestHeadersmoże spowodować problemy z HttpCacheModule , powinieneś PostReleaseRequestStatezamiast tego użyć czegoś podobnego .
Eirik H
5
Moduł nie jest wywoływany, gdy IIS wysyła nagłówek Not Modified 304 dla plików statycznych (css / less / images / etc), ponieważ nie dociera to do potoku ASP.NET, więc w tej sytuacji jest nadal renderowany serwer: Microsoft IIS / 7.5
Jano
42

Po włączeniu modułu ponownego zapisywania adresów URL w wersji 2.0 dla usług IIS (UrlRewrite) w sekcji konfiguracji <configuration><system.webServer><rewrite>dodaj regułę ruchu wychodzącego:

<outboundRules>
  <rule name="Remove RESPONSE_Server" >
    <match serverVariable="RESPONSE_Server" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>
JeffZhnn
źródło
11
Zauważ, że to tylko wyczyści nagłówek serwera, ale go nie usunie.
Nick Evans
Przepraszam za ignorancję, ale do której części mam to dodać ?! Próbowałem dodać go do <system.webServer>
Vignesh Subramanian
1
Dzięki! Działa w IIS 8.5, to takie proste. Nie mam edytora tekstu, ale możesz z łatwością korzystać z GUI. Nazwa powinna brzmieć RESPONSE_Server, a nie tylko Server (w tym miejscu zawiodłem na początku).
Louis Matthijssen
to wystarczy, jeśli masz aplikację inną niż ASP.Net, dlatego nie możesz usunąć nagłówka serwera z wymienionymi kodami
mhesabi
4
@vignesh to są podwęzły konfiguracji UrlRewrite. Musisz umieścić je pod rewritewęzłem system.webServer. Uważaj, spowoduje to awarię witryny, jeśli UrlRewrite nie jest zainstalowany na serwerze. I lepiej najpierw użyj konsoli konfiguracji IIS, aby sprawdzić, jak zapisuje te węzły konfiguracyjne.
Frédéric
36

Scott Mitchell podaje w poście na blogu rozwiązania do usuwania niepotrzebnych nagłówków .

Jak już wspomniano w innych odpowiedziach, w przypadku Servernagłówka istnieje rozwiązanie modułu http lub rozwiązanie web.config dla usług IIS 10+ lub zamiast tego można użyć URLRewrite do jego wyczyszczenia .

Najbardziej praktycznym rozwiązaniem dla aktualnej konfiguracji (IIS 10 +) jest użycie removeServerHeaderw pliku web.config:

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

Ponieważ X-AspNet-Versioni X-AspNetMvc-Version, zapewnia lepszy sposób niż usuwanie ich z każdej odpowiedzi: po prostu nie generowanie ich wcale.

Służy enableVersionHeaderdo wyłączania X-AspNet-Versionw pliku web.config

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

Użyj MvcHandler.DisableMvcResponseHeaderw zdarzeniu .Net Application_Start do wyłączeniaX-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true;

Na koniec usuń w konfiguracji usług IIS X-Powered-Byniestandardowy nagłówek w pliku web.config.

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

Uważaj, jeśli masz ARR (Routing żądań aplikacji), doda również swój własny X-Powered-By, który nie zostanie usunięty przez niestandardowe ustawienia nagłówków. Ten musi zostać usunięty przez Menedżera IIS, konfigurację Edytora w katalogu głównym IIS (nie w lokacji): przejdź do system.webServer/proxywęzła i ustaw arrResponseHeaderna false. Po an IISResetjest brany pod uwagę.
(Znalazłem ten tutaj , z wyjątkiem tego, że ten post dotyczy starego sposobu konfigurowania usług IIS 6.0).

Nie zapominaj, że rozwiązanie przez kod aplikacji nie dotyczy domyślnie nagłówka generowanego na statycznej zawartości (możesz aktywować, runAllManagedModulesForAllRequestsaby to zmienić, ale powoduje to, że wszystkie żądania uruchamiają potok .Net). Nie stanowi to problemu, X-AspNetMvc-Versionponieważ nie jest dodawane do zawartości statycznej (przynajmniej jeśli żądanie statyczne nie jest uruchamiane w potoku .Net).

Uwaga dodatkowa: jeśli celem jest zamaskowanie używanej technologii, należy również zmienić standardowe nazwy plików cookie .Net ( .ASPXAUTHjeśli aktywowano uwierzytelnianie formularzy (użyj nameatrybutu w formstagu w web.config), ASP.NET_SessionId(użyj <sessionState cookieName="yourName" />w web.config pod system.webtagiem), __RequestVerificationToken(zmień to kodem z AntiForgeryConfig.CookieName, ale niestety nie dotyczy to ukrytych danych wejściowych, które ten system generuje w html)).

Frédéric
źródło
18

W rzeczywistości zakodowane moduły i przykłady Global.asax pokazane powyżej działają tylko dla prawidłowych żądań.

Na przykład, dodaj <na końcu adresu URL, a otrzymasz stronę „Złe żądanie”, która nadal ujawnia nagłówek serwera. Wielu programistów to przeoczy.

Pokazane ustawienia rejestru również nie działają. URLScan to JEDYNY sposób usunięcia nagłówka „server” (przynajmniej w IIS 7.5).

Dan Ware
źródło
U mnie działa z zakodowanym modułem (dodanym w web.config) nawet przy złym żądaniu;) W global.asax tak naprawdę nie działa (np. Pliki statyczne itp.)
kapsiR
Miejmy nadzieję, że nadal masz włączone sprawdzanie poprawności żądań.
Dan Ware
1
czy ktoś ma alternatywę dla urlscan dla IIS 8+?
herostwist
Jest działające rozwiązanie przynajmniej w IIS10 +: stackoverflow.com/a/53222967/1671558
Ilya Chernomordik
16

Lub dodaj 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
źródło
3
Ta metoda nie usuwa nagłówka „Server”. Pozostałe są usuwane.
Pure.Krome
Możesz pozbyć się X-Powered-By w konfiguracji nagłówków odpowiedzi na poziomie serwera.
Wypalony śnieg
1
Nie wiem, czy są przypadki, w których w ten sposób usuwa się X-AspNet-Versioni X-AspNetMvc-Versionnagłówek. Wiem, że ten sposób nie zawsze działa (jeśli kiedykolwiek zadziała). Zobacz odpowiedź @Frederic, aby uzyskać bardziej niezawodny sposób ich usunięcia.
TheBlueSky
W IIS10 + jest teraz sposób na usunięcie nagłówka serwera: stackoverflow.com/a/53222946/1671558
Ilya Chernomordik
14

Ta web.configkonfiguracja działa w celu usunięcia wszystkich niepotrzebnych nagłówków z odpowiedzi ASP.NET (przynajmniej począwszy od 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>

Należy pamiętać, że powoduje to ukrycie wszystkich nagłówków „aplikacji”, podobnie jak wszystkie inne podejścia. Jeśli np. Przejdziesz na jakąś domyślną stronę lub stronę błędu wygenerowaną przez same IIS lub ASP.NET poza twoją aplikacją, te reguły nie będą miały zastosowania. Idealnie więc powinny znajdować się na poziomie głównym w usługach IIS, a ten próg może pozostawić pewne odpowiedzi na błędy w samych usługach IIS.

PS W IIS 10 jest błąd, który powoduje, że czasami wyświetla nagłówek serwera, nawet przy poprawnej konfiguracji. Powinno to już zostać naprawione, ale IIS / Windows musi zostać zaktualizowany.

Ilya Chernomordik
źródło
12

Oprócz odpowiedzi przepisywania adresu URL , oto pełny kod XML dlaweb.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>

Przepisywanie adresu URL

Vaibhav Garg
źródło
Czy to usuwa wszystkie wersje IIS i ASP od hakerów
agresja
1
Powyższa poprawka działa poprawnie na stronach internetowych, ale w przypadku obrazów / ikon, jeśli wystąpił wewnętrzny błąd serwera 500, zamiast wartości wyświetla się serwer: Microsoft-IIS / 7.5 Czy możesz mi w tym pomóc
ravithejag
11

Aby usunąć Server:nagłówek, przejdź do Global.asax, znajdź / utwórz Application_PreSendRequestHeaderswydarzenie i dodaj wiersz w następujący sposób (dzięki BK i temu blogowi to również nie zawiedzie na Cassini / lokalnym dev):

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

Jeśli chcesz uzyskać kompletne rozwiązanie do usuwania wszystkich powiązanych nagłówków na platformie Azure / IIS7, a także współpracujące z Cassini, zobacz ten link , który pokazuje najlepszy sposób wyłączania tych nagłówków bez korzystania z HttpModules lub URLScan.

Nick Evans
źródło
9

Jeśli chcesz tylko usunąć nagłówek, możesz użyć skróconej wersji odpowiedzi lukiffera:

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

A potem w Web.config:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHeaderModule" type="Site.HideServerHeaderModule" />
  </modules>
</system.webServer>
Drew Noakes
źródło
1
Jest to najbardziej odpowiednie, ponieważ zasoby takie jak css / js nie będą miały nagłówka serwera, będą przenosić z serwera na serwer bez konfiguracji, a nagłówek odpowiedzi serwera nie będzie po prostu pusty, nie zostanie wysłany.
Adam Caviness,
Widziałem komentarze, że runAllManagedModulesForAllRequests = "true" spowolni twoją aplikację i nie jest zalecane. Zamiast tego można by użyć modułu outboundRules urlrewrite do wyczyszczenia wartości serwera również dla plików statycznych. britishdeveloper.co.uk/2010/06/…
Juri
5

Spróbuj ustawić HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeaderwpis rejestru na REG_DWORDz 1.

Richard Deeming
źródło
Wpadłem w dziwną sytuację z naszą farmą serwerów, w której to ustawienie rejestru wydaje się być jedyną zmianą, która działa we wszystkich systemach operacyjnych (W2K8, W2K3), których używamy, zarówno dla IIS6, jak i IIS7.
jerhewet
2
Frustrujące jest to, że nie robi to dla mnie żadnej różnicy, nawet po ponownym uruchomieniu maszyny wirtualnej. Korzystamy z usług IIS 7.5 w systemie Windows Server 2008 R2 Standard, „Wersja 6.1 (kompilacja 7601: dodatek Service Pack 1)”. Podobnie mój OnPreSendRequestHeadersprogram obsługi zdarzeń (patrz wyżej) nigdy z jakiegoś powodu nie jest uruchamiany.
Owen Blacker
3
Niestety, wydaje się, że klucz rejestru nie działa w IIS 7.5
Andrew Csontos,
4

UrlScan może również usunąć nagłówek serwera, używając AlternateServerName=under [options].

eddiegroves
źródło
2

Kontynuując odpowiedź eddiegrovesa , w zależności od wersji URLScan, możesz zamiast tego wybrać RemoveServerHeader=1poniżej [options].

Nie jestem pewien, w której wersji narzędzia URLScan ta opcja została dodana, ale była dostępna w wersji 2.5 i nowszych.

technik
źródło
2

Znalazłem artykuł wyjaśniający, dlaczego musimy zarówno edytować rejestr, jak i używać narzędzia takiego jak UrlScan, aby poprawnie ustawić to w IIS. Śledziłem to na naszych serwerach i działa: http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx . Jeśli używasz tylko UrlScan, ale nie zmieniasz rejestru, w czasie zatrzymywania usługi World Wide Publishing Service serwer zwróci odpowiedź http serwera z pliku HTTP.sys. Poniżej przedstawiono typowe pułapki korzystania z narzędzia UrlScan: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008

Paweł
źródło
2
Prześlij swój kod na Stack Overflow. Linki mogą się zmieniać i pękać, więc kod pocztowy jest znacznie bardziej pomocny
Blundering Philosopher
2

W IIS 10 korzystamy z rozwiązania podobnego do podejścia Drew, tj .:

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

I oczywiście dodaj odniesienie do tej biblioteki dll w swoim projekcie (ach), a także moduł w konfiguracjach, które chcesz:

<system.webServer>
    <modules>
      <!--Use http module to remove/customize IIS "Server" header-->
      <add name="CustomHeaderModule" type="Common.Web.Modules.Http.CustomHeaderModule" />
    </modules>
</system.webServer>

WAŻNA UWAGA 1: To rozwiązanie wymaga zestawu aplikacji jako zintegrowanego;

WAŻNA UWAGA 2: będzie to miało wpływ na wszystkie odpowiedzi w aplikacji internetowej (w tym css i js);

xautau
źródło
1

Zbadałem to i metoda URLRewrite działa dobrze. Nie wydaje się, aby nigdzie dobrze znaleźć skrypt zmiany. Napisałem ten zgodny z programem PowerShell v2 i nowszym i przetestowałem go w usługach 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.
źródło
1

Możesz dodać poniższy kod w pliku Global.asax.cs

    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
    }
Dharmendra Kumar Sharma
źródło
1

Rozwiązanie zaproponowane powyżej w połączeniu działało u mnie z kolejnymi zmianami. Tutaj zamieszczam mój scenariusz i rozwiązanie.

U mnie chciałem usunąć następujące nagłówki:

  • serwer
  • X-Powered-By
  • Wersja X-AspNet
  • Wersja X-AspNetMvc

Dodałem je do mojego 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>

Powyższe zdarzenie nie było uruchamiane, więc dodałem następujący do web.config i zadziałało.

<modules runAllManagedModulesForAllRequests="true" />

aw celu usunięcia nagłówka wersji dodałem również do web.config:

<httpRuntime enableVersionHeader="false" />

Zmiany w 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>

Mam nadzieję, że to pomoże!

Zaki Mohammed
źródło
0

Wypróbowałem wszystkie rzeczy tutaj i na kilku innych podobnych wątkach przepełnienia stosu.

Rozłączyłem się na chwilę, ponieważ zapomniałem wyczyścić pamięć podręczną przeglądarki po wprowadzeniu zmian w konfiguracji. Jeśli tego nie zrobisz, a plik znajduje się w lokalnej pamięci podręcznej, zwróci Ci go z oryginalnymi nagłówkami (duh).

Mam to głównie działające poprzez usunięcie runAllManagedModulesForAllRequests:

<modules runAllManagedModulesForAllRequests="true">

To usunęło zbędne nagłówki z większości plików statycznych, ale nadal otrzymywałem nagłówek „Server” w niektórych statycznych plikach w moim projekcie WebAPI w swagger.

W końcu znalazłem i zastosowałem to rozwiązanie, a teraz wszystkie niechciane nagłówki zniknęły:

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

który omawia jego kod, który jest tutaj:

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

To jest moduł kodu natywnego. Jest w stanie usunąć nagłówek serwera, a nie tylko wyczyścić wartość. Domyślnie usuwa:

  • serwer
  • X-Powered-By
  • Wersja X-Aspnet
  • Serwer: Microsoft-HTTPAPI / 2.0 - który zostanie zwrócony, jeśli „żądanie nie zostanie przekazane do IIS”
TechSavvySam
źródło
-1

Usługi IIS 7.5 i prawdopodobnie nowsze wersje mają tekst nagłówka przechowywany w iiscore.dll

Używając edytora szesnastkowego, znajdź ciąg i słowo „Serwer” 53 65 72 76 65 72po nim i zastąp je bajtami zerowymi. W IIS 7.5 wygląda to tak:

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 

W przeciwieństwie do innych metod nie powoduje to spadku wydajności. Nagłówek jest również usuwany ze wszystkich żądań, nawet błędów wewnętrznych.

3dcdr
źródło