Entfernen / Ausblenden / Deaktivieren übermäßiger HTTP-Antwortheader in Azure / IIS7 ohne UrlScan


85

Ich muss übermäßige Header entfernen (hauptsächlich, um Penetrationstests zu bestehen). Ich habe mir einige Zeit mit Lösungen befasst, bei denen UrlScan ausgeführt wird. Diese sind jedoch umständlich, da UrlScan bei jedem Start einer Azure-Instanz installiert werden muss .

Es muss eine gute Lösung für Azure geben, bei der keine Installationsprogramme über startup.cmd bereitgestellt werden.

Ich verstehe, dass die Antwortheader an verschiedenen Stellen hinzugefügt werden :

  • Server : von IIS hinzugefügt.
  • X-AspNet-Version : hinzugefügt von System.Web.dll zum Zeitpunkt von Flush in der HttpResponse-Klasse
  • X-AspNetMvc-Version : Hinzugefügt von MvcHandler in System.Web.dll.
  • X-Powered-By : von IIS hinzugefügt

Gibt es eine Möglichkeit, IIS7 so zu konfigurieren (über web.config usw.?), Um die HTTP-Antwortheader zu entfernen / auszublenden / zu deaktivieren, um die Warnung "Übermäßige Header" auf asafaweb.com zu vermeiden , ohne ein IIS-Modul zu erstellen oder Installationsprogramme bereitzustellen , die dies benötigen jedes Mal ausgeführt werden, wenn eine Azure-Instanz gestartet wird?

Antworten:


139

Mit den folgenden Änderungen können Sie diese HTTP- Antwortheader in Azure entfernen, ohne ein benutzerdefiniertes HttpModule zu schreiben.

Die meisten Informationen im Internet sind veraltet und betreffen UrlScan (das inzwischen in IIS7 integriert wurde, aber die RemoveServerHeader=1Option entfernt wurde). Unten ist die sauberste Lösung, die ich gefunden habe (dank dieses Blogs , dieser Antwort und dieses Blogs zusammen).

Um Server zu entfernen , gehen Sie zu Global.asax, suchen / erstellen Sie das Application_PreSendRequestHeadersEreignis und fügen Sie Folgendes hinzu (dank BK und diesem Blog wird dies auch bei Cassini / local dev nicht fehlschlagen):

Bearbeitet im April 2014: Sie können die Ereignisse PreSendRequestHeaders und PreSendRequestContext mit nativen IIS-Modulen verwenden, jedoch nicht mit verwalteten Modulen, die IHttpModule implementieren. Das Festlegen dieser Eigenschaften kann Probleme mit asynchronen Anforderungen verursachen . Die richtige Version ist die Verwendung des BeginRequest-Ereignisses.

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

Zu entfernen X-AspNet-Version , suchen / erstellen <system.web>und fügen Sie in der web.config Folgendes hinzu:

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

    ...

Zu entfernen X-AspNetMvc-Version , gehen Sie zu Global.asax, suchen / erstellen Sie das Application_StartEreignis und fügen Sie eine Zeile wie folgt hinzu:

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

Um X-Powered-By zu entfernen , suchen / erstellen <system.webServer>und fügen Sie in der web.config Folgendes hinzu:

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

    ...

Laut Andeutung in VS ist es nicht erforderlich, Request, Response oder Response auf Null zu setzen. Header
Chris Haines

1
Beachten Sie bei Verwendung unter IIS und nicht unter Azure, dass sich der Anwendungspool im integrierten Modus befinden muss. Und .IsLocal sollte beim lokalen Debuggen entfernt werden.
IvanH

5
Es gibt keine Notwendigkeit für "Yoda-Bedingungen" in C # - es erlaubt keine Zuweisung in einer Bedingung, en.wikipedia.org/wiki/Yoda_Conditions
tvanfosson

1
Vielen Dank für die ausführliche Antwort. Ich habe jedoch versucht, die Schritte zu befolgen, aber jedes Mal, wenn ich die Site mit asafweb scanne, wird immer noch ein Problem mit dem übermäßigen Header (X-AspNet-Version) erwähnt. Ich habe sogar URLRewrite verwendet, um diesen Header zu entfernen. Gibt es noch andere Möglichkeiten, es zu entfernen?
Raymond A

4
Es besteht immer noch das Problem, eine nicht vorhandene Datei anzufordern , z. B. " yoursite / foo.jpg ". Da diese Anforderung nicht von MVC verarbeitet wird, ist der Antwortheader "Server: IIS xy" weiterhin vorhanden. Eine Lösung, die für Azure-Websites (und anscheinend NUR für Azure-Websites) funktioniert, besteht darin, diese unter <system.webServer> hinzuzufügen: <security xdt: Transform = "Insert"> <requestFiltering removeServerHeader = "true" /> </ security >
adrian h.

11

MSDN hat diesen Artikel zum Ausblenden von Headern auf Azure-Websites veröffentlicht. Sie können den Server jetzt vor web.config ausblenden, indem Sie einen Eintrag zu system.webServer hinzufügen

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

VS wird das oben Gesagte jedoch als ungültig ansehen. Der obige Link hat Code als Bilder, schwer zu finden. Die MVC-Version ist beim Anwendungsstart wie oben weiterhin ausgeblendet, genau wie bei der x-powered-by- und der .Net-Version.


3
Das ist genau das, was ich suchte. Danke dir.
Martin Costello

3
Dies funktioniert möglicherweise für Azure, jedoch nirgendwo anders. Die Kommentare zu diesem Artikel bestätigen dies ebenso wie meine eigenen Tests. Die Antwort von @ giveme5minutes ist die Art und Weise, wie es funktioniert.
CrazyPyro

Wäre schön zu wissen, was implementiert wurde, um diese Funktion zu machen: | Zumal URL SCAN dies bereits standardmäßig implementiert hat.
Felickz

6

Es gibt auch ein Paket auf NuGet, mit dem Sie dies durch ein paar Konfigurationszeilen und keine Änderungen am Code erreichen können: NWebsec. Die Dokumente zum Entfernen von Versionsheadern finden Sie hier: https://github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers

Es wird hier vorgeführt: http://www.nwebsec.com/HttpHeaders/VersionHeaders (in Azure)

Haftungsausschluss: Ich bin der Entwickler des Projekts.


"Mit NWebsec können Sie fast alle diese Versionsheader unterdrücken, dh alle außer dem Server: Microsoft-IIS / 8.0-Header." :( github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers
felickz

Es wurde von Codeplex zu GitHub verschoben (bitte Link github.com/NWebsec/NWebsec/wiki aktualisieren )
Nordes

6

Die Antwort von Nick Evans ist perfekt, aber ...

Wenn Sie diese Header aus Sicherheitsgründen entfernen , vergessen Sie nicht, die ASP.NET Session coockie name! Weil es einfacher ist, die verwendete Sprache oder die Serverversion zu erraten, wenn Sie Folgendes sehen:

Geben Sie hier die Bildbeschreibung ein

So ändern Sie den Cookie-Namen: (Seien Sie kreativ)

<system.web>
  <sessionState cookieName="PHPSESSID" />
</system.web>

Das Ändern des Cookie-Namens hat mehr Vorteile als nur die Exposition gegenüber Servertechnologie - z. B. verringert das Risiko einer generischen Ernte von
Massensitzungen

3

Wenn Sie die vorherigen Antworten von @ giveme5minutes und @AKhooli zusammenfassen, die sich auf Azure-Websites beziehen, sowie einige andere Elemente, die der Scanner sehen möchte, sind dies die Änderungen, die ich vorgenommen habe, um ASafaWeb mit einer Azure-Site zufrieden zu stellen.

Es wird immer noch beanstandet, dass das Azure-Affinitätsheader-Cookie nicht nur https ist, sondern dass Affinität die Art von Cookie ist, die Sie trotzdem wiedergeben möchten, oder?

<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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.