So entfernen Sie IIS / ASP.NET-Antwortheader


46

Ich habe einige IIS / 6.0-Server, auf denen ich vom Sicherheitsdienst aufgefordert werde, einige Antwortheader zu entfernen, die bei Anforderungen an Clientbrowser gesendet werden. Sie sind besorgt über die Weitergabe von Plattforminformationen über Antwort-Header. Ich habe alle HTTP-HEADERS aus der IIS-Konfiguration für die Website entfernt (X-Powered-By oder ein solcher Header).

(Ich persönlich weiß, dass diese Informationen leicht gefunden werden können, auch wenn sie verborgen sind, aber nicht mein Anruf.)

Überschriften, die ich entfernen möchte:

  • Server - Microsoft-IIS / 6.0
  • X-AspNet-Version - 2.0.50727

Ich weiß auch, dass ASP.NET MVC auch einen eigenen Header ausgibt. Wenn Sie wissen, wie man ihn auch entfernt, wäre das hilfreich.

  • X-AspNetMvc-Version - 1.0

Antworten:


32

Ihre Sicherheitsabteilung möchte, dass Sie dies tun, um die Identifizierung des Servertyps zu erschweren. Dies kann die Flut von automatisierten Hacking-Tools verringern und es für die Benutzer schwieriger machen, in den Server einzudringen.

Öffnen Sie in IIS die Websiteeigenschaften und wechseln Sie dann zur Registerkarte HTTP-Header. Die meisten X-Header können hier gefunden und entfernt werden. Dies kann für einzelne Sites oder für den gesamten Server erfolgen (ändern Sie die Eigenschaften für das Websites-Objekt in der Struktur).

Für den Server-Header können Sie unter IIS6 das URLScan- Tool von Microsoft verwenden, um dies zu entfernen . Port 80 Software stellt auch ein Produkt namens ServerMask her , das dies und vieles mehr für Sie erledigt .

Für IIS7 gibt es einen großartigen Artikel zur Verwendung eines benutzerdefinierten Moduls zum Ändern des Server-Headers.

Für den MVC-Header in Global.asax:

MvcHandler.DisableMvcResponseHeader = true;

2
Akzeptierte Antwort, wünschte, ich könnte die Antwort mit @squillman teilen. Web.config zur Behebung der X-AspNet-Version: <system.web> <httpRuntime enableVersionHeader = "false" /> </ system.web>
Bryan Rehbein

Das Entfernen des X-Headers fügt dies in meine web.config ein. Sparen Sie sich also etwas Zeit: <system.webServer> <httpProtocol> <customHeaders> <remove name = "X-Powered-By" /> </ customHeaders> </ httpProtocol> </ system.webServer>
Broam

Broam, das ist die richtige Antwort ... für IIS7. Die Frage ist über IIS6. Dies hat keine Auswirkungen auf IIS6.
Anthony

56

Um alle benutzerdefinierten Header zu entfernen, die zu viele Informationen enthalten, wurden die Methoden für IIS 7 (leider) geändert:

Headername: X-Powered-By

Hinzufügen:

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

in der <system.webServer>Sektion.

Headername: Server

Implementieren Sie ein httpModule, das diesen Header entfernt, indem Sie Response.Headers.Remove ("Server") aus dem PreSendRequestHeaders-Ereignis aufrufen. Eine weitere Ressource hierfür: Verschleiern Ihrer ASP.NET MVC-Webanwendung unter IIS 7

Headername : X-AspNet-Version

Im httpRuntime-Bereich der web.config - set:

<httpRuntime enableVersionHeader="false" />

Headername : X-AspNetMvc-Version

Führen Sie im Application_Start-Ereignis in global.asax den folgenden Code (C #) aus:

MvcHandler.DisableMvcResponseHeader = true;

Ich möchte nur etwas präzisieren: Die meisten dieser Tricks funktionieren nur mit IIS> = 7 im integrierten Pipeline-Modus. Im klassischen Modus wird bestenfalls nichts unternommen (<remove> -Zeilen in web.config) oder eine Ausnahme ausgelöst (direkte Aufrufe von Response.Headers in global.asax, eine andere Lösung zum Entfernen von Headern). Ich arbeite an einer Website im klassischen Modus und konnte diese Header leider nicht entfernen.
AFract

16

Wenn Sie dies in die web.config-Datei einer ASP.NET-Anwendung einfügen, wird der Header der X-AspNet-Version entfernt:

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

Beachten Sie, dass das Tag system.web bereits in der Datei vorhanden sein sollte. Erstellen Sie kein Duplikat, fügen Sie einfach das httpRuntime-Tag hinzu. Das httpRuntime-Tag ist möglicherweise auch bereits vorhanden. Wenn ja, fügen Sie einfach das Attribut hinzu oder setzen Sie den Wert, wenn es bereits vorhanden ist.


Hierdurch bleibt jedoch der Header "powered by" erhalten.
UpTheCreek

aber wenn ich diesen zeilencode in system.webmeine website stecke, geht das runter. wissen Sie, warum?
Neda Derakhshesh

5

Nachdem ich gerade den "Hardening" -Zyklus meines aktuellen Projekts durchlaufen hatte, bloggte ich über unseren Ansatz, der ein HTTPModule zum Entfernen der folgenden Header enthält :

Server,
X-AspNet-Version,
X-AspNetMvc-Version,
X-Powered-By

Passende Stücke sind unten abgebildet:

Es gibt jedoch keine einfache Möglichkeit, den Server-Antwortheader über die Konfiguration zu entfernen. Zum Glück verfügt IIS7 über eine verwaltete, steckbare Modulinfrastruktur, mit der Sie die Funktionalität problemlos erweitern können. Im Folgenden finden Sie die Quelle für ein HttpModule zum Entfernen einer angegebenen Liste von HTTP-Antwortheadern:

namespace Zen.Core.Web.CloakIIS
{
    #region Using Directives

    using System;
    using System.Collections.Generic;
    using System.Web;

    #endregion

    /// <summary>
    /// Custom HTTP Module for Cloaking IIS7 Server Settings to allow anonymity
    /// </summary>
    public class CloakHttpHeaderModule : IHttpModule
    {
        /// <summary>
        /// List of Headers to remove
        /// </summary>
        private List<string> headersToCloak;

        /// <summary>
        /// Initializes a new instance of the <see cref="CloakHttpHeaderModule"/> class.
        /// </summary>
        public CloakHttpHeaderModule()
        {
            this.headersToCloak = new List<string>
                                      {
                                              "Server",
                                              "X-AspNet-Version",
                                              "X-AspNetMvc-Version",
                                              "X-Powered-By",
                                      };
        }

        /// <summary>
        /// Dispose the Custom HttpModule.
        /// </summary>
        public void Dispose()
        {
        }

        /// <summary>
        /// Handles the current request.
        /// </summary>
        /// <param name="context">
        /// The HttpApplication context.
        /// </param>
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += this.OnPreSendRequestHeaders;
        }

        /// <summary>
        /// Remove all headers from the HTTP Response.
        /// </summary>
        /// <param name="sender">
        /// The object raising the event
        /// </param>
        /// <param name="e">
        /// The event data.
        /// </param>
        private void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            this.headersToCloak.ForEach(h => HttpContext.Current.Response.Headers.Remove(h));
        }
    }
}

Stellen Sie sicher, dass Sie die Assembly signieren. Anschließend können Sie sie im GAC Ihrer Webserver installieren und einfach die folgende Änderung an der web.config Ihrer Anwendung vornehmen (oder, wenn Sie möchten, dass sie global angewendet wird, an der machine.config):

<configuration>
    <system.webServer>
        <modules>
            <add name="CloakHttpHeaderModule" 
                 type="Zen.Core.Web.CloakIIS.CloakHttpHeaderModule, Zen.Core.Web.CloakIIS, 
                       Version=1.0.0.0, Culture=neutral, PublicKeyToken=<YOUR TOKEN HERE>" />
        </modules>
    </system.webServer>
</configuration>

2
Die Generierung der Header durch Konfiguration zu unterdrücken, scheint viel sinnvoller zu sein, als die Header generieren und dann entfernen zu lassen.
RealMarkusSchmidt

1
Scheint, als ob dieser Link jetzt tot ist. :-(
Danny Schoemann

2

Überprüfen Sie diesen Blog . Verwenden Sie keinen Code, um Antwortheader zu entfernen. Es ist laut Microsoft instabil

Verwenden Sie stattdessen den Abschnitt Web.config custom Headers:

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

Dies war die Lösung für mein Problem. Verwenden von Win2008 R2 (IIS 7.5)
Paqogomez

1

Ich benutze folgenden Code und funktioniert für mich iis 7.5

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

3
Was ist mit Ihren Bildern und Inhalten, die die Code-Pipeline nicht durchlaufen?
Mark Sowul

Was hast du in den "Server" gestellt? soll es so sein Response.Headers.Remove ("Server: Microsoft-IIS / 7.0"); ? oder sollte es Server sein? bitte helfen
neda Derakhshesh

Ich habe nur "Server" nichts anderes gesetzt. Wenn Ihr Headername anders ist, können Sie es mit einem anderen Namen versuchen.
Nasir Mahmood
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.