2009-07-24 16 views
89

Gibt es eine Möglichkeit, "Server" Antwortheader von IIS7 zu entfernen? Es gibt einige Artikel, die zeigen, dass wir mit HttpModules dasselbe erreichen können. Dies ist hilfreich, wenn wir kein Administratorrecht für den Server haben. Außerdem möchte ich keinen ISAPI-Filter schreiben.Server Antwort Header entfernen IIS7

Ich habe Administratorrechte für meinen Server. Also möchte ich die obigen Sachen nicht machen. Also, bitte hilf mir, das Gleiche zu tun.

+0

See werden: http://stackoverflow.com/questions/22401219/remove-server-response-header-iis-8-0-8-5#39472251 –

Antwort

73

In IIS7 müssen Sie ein HTTP-Modul verwenden. Bauen Sie das folgende als eine Klassenbibliothek in 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"); 
    } 
    } 
} 

Dann folgendes zu Ihrer web.config hinzufügen, oder Sie konfigurieren es innerhalb IIS (wenn Sie in IIS konfigurieren, muss die Assembly im GAC sein).

<configuration> 
    <system.webServer> 
    <modules> 
     <add name="CustomHeaderModule" 
     type="StrongNamespace.HttpModules.CustomHeaderModule" /> 
    </modules> 
    </system.webServer> 
</configuration> 
+0

ausgezeichnet, kann ich auch zwicken um den ETag-Header in meiner Serverfarm zu entfernen. – devstuff

+0

Dies verursacht einen Laufzeitfehler in casini .../ASP.NET Dev-Server – UpTheCreek

+0

Das Ändern der Headerwerte erfordert den integrierten Modus von IIS7. Die Ausnahme wird jedoch ignoriert, sofern keine andere Ausnahme im Kontext der Anforderung ausgelöst wird. Pro Titel wurde die Frage an IIS7, nicht an Casini gerichtet. – lukiffer

4

UrlScan können auch den Server-Header entfernen, indem AlternateServerName= unter [options] verwenden.

5

Versuchen Sie, den Registrierungseintrag HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeader auf REG_DWORD von 1 zu setzen.

+0

Es kam zu einer seltsamen Situation in unserer Serverfarm, bei der diese Registrierungseinstellung die einzige Änderung zu sein scheint, die für alle von uns verwendeten Betriebssysteme (W2K8, W2K3) sowohl für IIS6 als auch für IIS7 funktioniert. – jerhewet

+2

Frustrierend macht dies keinen Unterschied für mich, auch nach dem Neustart der virtuellen Maschine. Wir verwenden IIS 7.5 unter Windows Server 2008 R2 Standard "Version 6.1 (Build 7601: Service Pack 1)". In ähnlicher Weise wird mein 'OnPreSendRequestHeaders'-Ereignishandler (siehe oben) aus irgendeinem Grund niemals ausgelöst. –

+1

Leider scheint der Registrierungsschlüssel nicht auf IIS 7.5 zu funktionieren –

8

Wenn Sie nur den Header entfernen Sie eine verkürzte Version von lukiffer Antwort verwenden können:

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

Und dann in Web.config:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="CustomHeaderModule" type="Site.HideServerHeaderModule" /> 
    </modules> 
</system.webServer> 
+1

Dies ist am besten geeignet, da Ressourcen wie css/js nicht den Server-Header haben, es Ports von Server zu Server ohne Konfiguration und der Server-Antwort-Header wird nicht nur sein leer, wird nicht gesendet. –

+0

Ich habe Kommentare gesehen, dass runAllManagedModulesForAllRequests = "true" Ihre App verlangsamen wird und nicht empfohlen wird. Stattdessen könnte man urlrewrite outboundRules verwenden, um den Serverwert auch für statische Dateien zu löschen. http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html – Juri

2

auf eddiegroves' answer Anknüpfend, je nach Ausführung von URLScan können Sie stattdessen RemoveServerHeader=1 unter [options] bevorzugen.

Ich bin nicht sicher, in welcher Version von URLScan diese Option hinzugefügt wurde, aber es war in Version 2.5 und höher verfügbar.

92

Fügen Sie diese auf Ihre global.asax.cs:

protected void Application_PreSendRequestHeaders() 
{ 
    Response.Headers.Remove("Server"); 
    Response.Headers.Remove("X-AspNet-Version"); 
    Response.Headers.Remove("X-AspNetMvc-Version"); 
} 
+0

Ich versuchte die Registry-Option von @Richard oben ohne Glück. Ich verwende Win 2008 R2 und der Registrierungsschlüssel fehlte, also habe ich einen neuen DWORD-Schlüssel hinzugefügt, der möglicherweise falsch war. Diese Option funktionierte jedoch perfekt. Vielen Dank! –

+11

Ich weiß nicht, warum die HTTP-Modul Antwort ist höher als diese, diese ist viel einfacher – jjxtra

+0

Dies ist die einfachste Methode, die ich gefunden habe, um die 'Server' Header von IIS7 Antworten zu entfernen. Vielen Dank. – Corgalore

30

verwenden, um die IIS UrlRewrite 2,0

<outboundRules> 
    <rule name="Remove RESPONSE_Server" > 
    <match serverVariable="RESPONSE_Server" pattern=".+" /> 
    <action type="Rewrite" value="" /> 
    </rule> 
</outboundRules> 
+9

Beachten Sie, dass dies nur die Server-Kopfzeile löscht, es wird nicht entfernt. –

+0

Sorry für die Ignoranz aber zu welchem ​​Teil soll ich das hinzufügen? Ich habe versucht, es in

+1

10 hinzuzufügen Danke! Funktioniert in IIS 8.5, das ist so einfach. Ich habe keinen Texteditor, aber Sie können einfach die GUI verwenden. Der Name sollte RESPONSE_Server sein, nicht nur der Server (hier bin ich zuerst gescheitert). –

9

den Server: Header zu entfernen, gehen Sie zu Global.asax, finden/erstellen die Application_PreSendRequestHeaders Ereignis und fügen Sie eine Zeile wie folgt hinzu (dank BK und this blog wird dies auch beim Cassini/lokalen Entwickler nicht fehlschlagen):

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

Wenn Sie eine vollständige Lösung zum Entfernen aller verwandten Kopfzeilen in Azure/IIS7 benötigen und auch mit Cassini arbeiten möchten, finden Sie unter this link die beste Möglichkeit, diese Kopfzeilen ohne Verwendung von HttpModules oder URLScan zu deaktivieren.

18

Tatsächlich funktionieren die oben gezeigten codierten Module und die Global.asax-Beispiele nur für gültige Anforderungen.

Fügen Sie zum Beispiel < am Ende Ihrer URL hinzu und Sie erhalten eine Seite "Bad request", die immer noch den Server-Header offen legt. Viele Entwickler übersehen dies.

Die angezeigten Registrierungseinstellungen funktionieren auch nicht. URLScan ist die einzige Möglichkeit, den Header "Server" zu entfernen (zumindest in IIS 7.5).

+0

Es funktioniert für mich mit dem codierten Modul (in web.config hinzugefügt) auch bei einer schlechten Anfrage;) In global.asax es funktioniert nicht wirklich (z. B. statische Dateien usw.) – kapsi

+0

Hoffen wir, dass Sie die Anforderungsvalidierung noch eingeschaltet haben. –

+0

hat jemand eine Alternative zu URLscan für IIS 8+? – herostwist

22

Scott Mitchell bietet in einem Blogbeitrag Lösungen für removing unnecessary headers.

Wie bereits hier in anderen Antworten gesagt, gibt es für die Server Kopfzeile das http module solution oder das UrlScan Modul. (URLScan-Modul ist nicht mehr in IIS7.5 + verfügbar Verwenden URLRewrite instead for blanking it..)

Für X-AspNet-Version und X-AspNetMvc-Version, er bietet einen besseren Weg, als sie auf jeder Antwort zu entfernen: einfach nicht, sie überhaupt zu erzeugen.

Verwenden enableVersionHeader für X-AspNet-Version zu deaktivieren, in web.config

<httpRuntime enableVersionHeader="false" /> 

Verwenden MvcHandler.DisableMvcResponseHeader in Event .Net Application_Start für X-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true; 

deaktivieren und schließlich die X-Powered-By benutzerdefinierten Header in IIS-Konfiguration entfernen.

Vergessen Sie nicht, dass die Lösung nach Anwendungscode nicht standardmäßig auf Header auf statischen Inhalt (Sie können die runAllManagedModulesForAllRequests aktivieren, um das zu ändern, aber es bewirkt, dass alle Anfragen zu laufen. Net-Pipeline) gelten. Es ist kein Problem für X-AspNetMvc-Version, da es nicht auf statischen Inhalt hinzugefügt wird (zumindest wenn statische Anforderung nicht in .Net-Pipeline ausgeführt werden).

Randbemerkung: wenn das Ziel verwendete Technologie zum Tarnen ist, sollten Sie auch Standard-.Net-Cookie-Namen ändern (.ASPXAUTH wenn Formulare Auth aktiviert (Verwendung name Attribut auf forms Tag in web.config), ASP.NET_SessionId (verwenden <sessionState cookieName="yourName" /> in web .config unter system.web Tag), __RequestVerificationToken (ändern Sie es durch Code mit AntiForgeryConfig.CookieName, aber leider nicht für die versteckte Eingabe, die dieses System im HTML generiert)).

11

Oder in web.config hinzufügen:

<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> 
+1

Diese Methode entfernt den Header "Server" nicht. Die anderen sind entfernt. –

+0

Sie können X-Powered-By in der Response-Header-Konfiguration auf Serverebene loswerden. – Snowburnt

+1

Ich weiß nicht, ob es Fälle gibt, in denen dieser Weg den Header 'X-AspNet-Version' und' X-AspNetMvc-Version' entfernt. Was ich weiß ist dieser Weg funktioniert nicht immer (wenn es überhaupt funktioniert). Siehe @Frederic-Antwort für eine zuverlässigere Möglichkeit, sie zu entfernen. – TheBlueSky

2

ich einen Artikel gefunden, der erklärt, warum wir beide Registry bearbeiten tun müssen, und ein Tool wie UrlScan verwenden diese ordnungsgemäß in IIS einzurichten. Ich habe es auf unseren Servern verfolgt und es funktioniert: http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx. Wenn Sie nur UrlScan verwenden, die Registrierungsänderung jedoch nicht vornehmen, gibt der Server während der Zeit, in der Sie den WWW-Publishingdienst stoppen, die HTTP-Antwort des Servers aus der Datei HTTP.sys zurück. Auch hier sind gemeinsame pitfals der Verwendung von UrlScan-Tool: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008

+2

Bitte schreiben Sie Ihren Code auf Stack Overflow. Links können sich ändern und brechen, so dass Buchung Code ist viel hilfreicher –

10

Ergänzung der URL Rewrite answer, hier ist die komplette XML für web.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

+0

Entfernt alle IIS und ASP-Versionen von Hacker – aggie

+0

Das obige Update funktioniert ordnungsgemäß für die Webseiten. Aber für Bilder/Symbole, wenn 500 Interner Server Fehler aufgetreten ist es zeigt die Server: Microsoft-IIS/7.5 anstelle des Wertes. Bitte helfen Sie mir dabei – ravithejag

0

In IIS 10 verwenden wir eine ähnliche Lösung zu Drews Ansatz, d:

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

Und natürlich in der Config (n) Sie wollen eine Referenz auf diese DLL in Ihrem Projekt (en) und auch das Modul hinzufügen:

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

WICHTIG NOTE1 : Diese Lösung benötigt einen Anwendungspool, der als integriert festgelegt ist.

WICHTIGER HINWEIS2: Alle Antworten innerhalb der Web-App sind davon betroffen (css und js enthalten);

0

Ich probierte alle Sachen hier und auf mehreren anderen ähnlichen Stack Overflow Threads.

Ich habe aufgelegt, weil ich vergessen habe, meinen Browser-Cache zu leeren, nachdem ich die Konfigurationsänderungen vorgenommen habe. Wenn Sie das nicht tun und die Datei sich in Ihrem lokalen Cache befindet, wird sie Ihnen mit den ursprünglichen Headern (duh) zugestellt.

Ich habe es vor allem von Arbeits die runAllManagedModulesForAllRequests Entfernung:

<modules runAllManagedModulesForAllRequests="true"> 

Dies entfernt die Fremd Header aus meisten der statischen Dateien, aber ich war immer noch den „Server“ Header auf einige statische Dateien bekommen in meinem WebAPI-Projekt in Swagger.

fand ich schließlich und wandte diese Lösung und jetzt alle der unerwünschten Header verschwunden sind:

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

die seinen Code diskutiert, die hier ist:

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

Diese ist ein Native-Code-Modul. Es ist in der Lage zu den Server-Header zu entfernen, nicht nur den Wert zu leeren. Standardmäßig es entfernt:

  • Server
  • X-Powered-By
  • X-Aspnet-Version
  • Server: Microsoft-HTTPAPI/2.0 - was, wenn „die Anforderung zurückgegeben werden würde fehlschlägt bestanden IIS“