Wie entferne ich ASP.Net MVC Standard-HTTP-Header?

175

Jede Seite in einer MVC-Anwendung, mit der ich arbeite, legt diese HTTP-Header in Antworten fest:

X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
X-AspNetMvc-Version: 2.0

Wie verhindere ich, dass diese angezeigt werden?

Paul Fryer
quelle
2
Lesen Sie diesen Artikel Entfernen unnötiger HTTP-Header in IIS und ASP.NET . Hier wird beschrieben, wie Sie alle aufgelisteten Header entfernen.
Pavel Morshenyuk
@PavelMorshenyuk Entschuldigung, haben Sie auch eine Möglichkeit gefunden, den Servernamen zu entfernen? Die akzeptierte Antwort entfernt den Server nicht
neda Derakhshesh

Antworten:

284

X-Powered-Byist ein benutzerdefinierter Header in IIS. Seit IIS 7 können Sie es entfernen, indem Sie Folgendes zu Ihrem hinzufügen web.config:

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

Dieser Header kann auch an Ihre Bedürfnisse angepasst werden. Weitere Informationen finden Sie unter http://www.iis.net/ConfigReference/system.webServer/httpProtocol/customHeaders


Fügen Sie dies hinzu, web.configum den X-AspNet-VersionHeader zu entfernen:

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

Zum Entfernen X-AspNetMvc-Version, Bearbeiten Global.asax.csund Hinzufügen des folgenden Application_StartEreignisses:

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

Sie können Header auch zur Laufzeit über das Application_PreSendRequestHeadersEreignis in ändern Global.asax.cs. Dies ist nützlich, wenn Ihre Header-Werte dynamisch sind:

protected void Application_PreSendRequestHeaders(object source, EventArgs e)
{
      Response.Headers.Remove("foo");
      Response.Headers.Add("bar", "quux");
}
RedFilter
quelle
4
+1 - Um des Interesses willen, 1) Warum sollten Sie? 2) Hat es irgendwelche nachteiligen Auswirkungen?
BritishDeveloper
69
Sie tun dies aus Sicherheitsgründen, um zu verschleiern, welche Technologie Sie zum Generieren Ihrer Webseiten verwenden. Dies zwingt Hacker dazu, etwas härter zu arbeiten.
RedFilter
20
@BritishDeveloper Dies war eine Empfehlung, die aus einer Sicherheitsüberprüfung hervorging. Ich denke, es ist eine bewährte Methode, Ihren Technologie-Stack nicht zu bewerben, da dies Hackern hilft, bestimmte Schwachstellen mit dieser Plattform zu beseitigen.
Paul Fryer
1
@ RedFilter Vielen Dank für Ihre schnelle und detaillierte Antwort!
Paul Fryer
6
Unter IIS 8 wird der X-Powered-ByHeader dadurch nicht entfernt . Weitere Antworten dazu finden Sie in web.config.
Knelis
105

Sie können sie auch entfernen, indem Sie Ihrer global.asax-Datei Code hinzufügen:

 protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
 {
   HttpContext.Current.Response.Headers.Remove("X-Powered-By");
   HttpContext.Current.Response.Headers.Remove("X-AspNet-Version");
   HttpContext.Current.Response.Headers.Remove("X-AspNetMvc-Version");
   HttpContext.Current.Response.Headers.Remove("Server");
 }
bkaid
quelle
29
In meinem Fall funktionierten nur die letzten drei, für "X-Powered-By" brauchte ich noch<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
Frank van Eykelen
2
In meinem Fall wurde keiner der oben genannten Header entfernt. Ich benutze .net 4.0 und IIS 7. Dank anderer Kommentare in diesem Thread. Ich habe es geschafft, alle unerwünschten Header mit Ausnahme von "Server" zu entfernen, was der schlimmste Fall ist.
Farjad
2
Funktioniert es gegen Ihre Inhaltsdateien / Bilder / usw., die den Codepfad nicht durchlaufen?
Mark Sowul
Was hast du in den "Server" gestellt? sollte es so sein Response.Headers.Remove ("Server: Microsoft-IIS / 7.0"); ? oder sollte es "Server" sein? Bitte helfen Sie
Neda Derakhshesh
Seltsam für andere, dass "PreSendRequestHeaders" tatsächlich Pre-Send-Antwortheader ist?
JDPeckham
50

Ich habe diese Konfiguration in meiner gefunden, web.configdie für eine New Web Site...in Visual Studio erstellte Konfiguration war (im Gegensatz zu a New Project...). Da die Frage eine ASP.NET MVC-Anwendung angibt, nicht als relevant, aber dennoch eine Option.

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

Update : Troy Hunt hat auch einen Artikel mit dem Titel Shhh… lassen Sie Ihre Antwortheader nicht zu laut sprechen, mit detaillierten Schritten zum Entfernen dieser Header sowie einem Link zu seinem ASafaWeb- Tool zum Scannen nach ihnen und anderen Sicherheitskonfigurationen.

Kevin Hakanson
quelle
5
Beste Option, erfordert aber iis7 + Sie müssen sie nicht <löschen /> ... entfernen ist genug .. Sie möchten dies möglicherweise auch zu system.webserver hinzufügen, um eine weitere Sicherheitsanfälligkeit zu beseitigen: code <Sicherheit> <Anforderungsfilterung> <Verbien> <Verb hinzufügen = "OPTIONEN" erlaubt = "falsch" /> </ verbs> </ requestFiltering> </ security>code
felickz
Ich denke, das <clear /> -Element löscht alle Header, einschließlich des 'X-Powererd-By', sodass das <remove /> -Element redundant ist.
Jan H
32

Wie unter Verschleiern Ihrer ASP.NET MVC-Webanwendung unter IIS 7 beschrieben , können Sie den X-AspNet-Versionsheader deaktivieren, indem Sie den folgenden Konfigurationsabschnitt auf Ihre web.config anwenden:

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

und entfernen Sie den Header der X-AspNetMvc-Version, indem Sie Ihre Datei Global.asax.cs wie folgt ändern:

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

Wie unter Benutzerdefinierte Header beschrieben Sie können den Header "X-Powered-By" entfernen, indem Sie den folgenden Konfigurationsabschnitt auf Ihre web.config anwenden:

<system.webServer>
   <httpProtocol>
      <customHeaders>
         <clear />
      </customHeaders>
   </httpProtocol>
</system.webServer>

Es gibt keine einfache Möglichkeit, den Antwortheader "Server" über die Konfiguration HttpModulezu entfernen. Sie können jedoch einen implementieren , um bestimmte HTTP-Header zu entfernen, wie unter Verschleiern Ihrer ASP.NET MVC-Webanwendung unter IIS 7 und unter Entfernen des Servers beschrieben. x-aspnet-version-x-aspnetmvc-version-und-x-powered-by-from-the-response-header-in-iis7 .

RonyK
quelle
Mit bkaid answer kann ich den "Server" -Header entfernen. IIS 8.
Tmorell
Die Antwort von bkaid ist in Ordnung, erfordert jedoch eine Codierung. Daher fand ich die von mir beschriebene Lösung praktischer, da sie auf der Konfiguration basiert.
RonyK
32

.NET Core

Fügen Sie zum Entfernen des Server- Headers in der Datei Program.cs die folgende Option hinzu:

.UseKestrel(opt => opt.AddServerHeader = false)

Fügen Sie für Punktnetzkern 1 die Option im Aufruf von .UseKestrel () hinzu. Fügen Sie für Punktnetzkern 2 die Zeile nach UseStartup () hinzu.

Um den X-Powered-By- Header zu entfernen , bearbeiten Sie bei Bereitstellung in IIS Ihre web.config und fügen Sie den folgenden Abschnitt in das system.webServer-Tag ein:

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

.NET 4.5.2

Fügen Sie in Ihrer Datei global.asax Folgendes hinzu, um den Server- Header zu entfernen :

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string[] headers = { "Server", "X-AspNet-Version" };

        if (!Response.HeadersWritten)
        {
            Response.AddOnSendingHeaders((c) =>
            {
                if (c != null && c.Response != null && c.Response.Headers != null)
                {
                    foreach (string header in headers)
                    {
                        if (c.Response.Headers[header] != null)
                        {
                            c.Response.Headers.Remove(header);
                        }
                    }
                }
            });
        }

    }

Pre .NET 4.5.2

Fügen Sie Ihrem Projekt die folgende c # -Klasse hinzu:

public class RemoveServerHeaderModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    public void Dispose() { }

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpContext.Current.Response.Headers.Remove("Server");
    }
}

Fügen Sie dann in Ihrer web.config den folgenden Abschnitt <Module> hinzu:

<system.webServer>
    ....
 <modules>
    <add name="RemoveServerHeaderModule" type="MyNamespace.RemoveServerHeaderModule" />
 </modules>

Ich hatte jedoch ein Problem, bei dem Teilprojekte dieses Modul nicht finden konnten. Kein Spaß.

Entfernen des X-AspNetMvc-Version-Headers

Um das Tag "X-AspNetMvc-Version" für eine beliebige Version von .NET zu entfernen, ändern Sie Ihre Datei "web.config" so, dass sie Folgendes enthält:

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

Vielen Dank an Microsoft, dass Sie dies unglaublich schwierig gemacht haben. Oder vielleicht war das Ihre Absicht, damit Sie IIS- und MVC-Installationen auf der ganzen Welt verfolgen können ...

Rocklan
quelle
3
In der heutigen Zeit wird dies als "schlechteste Praxis" angesehen und es ist kaum zu glauben, dass Microsoft "unsicher" immer noch zum Standard macht und es so schwierig ist, sich für "sicher" zu entscheiden. Es erinnert mich daran, wie Windows die gängigen Dateierweiterungen standardmäßig verbirgt, sodass ahnungslose Benutzer auf Viren klicken. Ich erinnere mich an Bill Gates, der 2003 "standardmäßig sicher" ankündigte - was ist mit dieser Idee passiert?
Mike Nelson
2
@mikenelson Wenn Sie sich dadurch besser fühlen, ist es genauso schwierig, das Server-Tag in Nginx zu entfernen. Am Ende musste ich den eigentlichen Quellcode selbst hacken.
Rocklan
Über RemoveServerHeaderModulesie wird nicht funktionieren in WebAPI Projekt.
Krypru
8

Wie auf der Seite Entfernen von Standardserver-Headern auf Windows Azure-Websites gezeigt , können Sie Header folgendermaßen entfernen:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <clear />
      </customHeaders>
    </httpProtocol>
    <security>
      <requestFiltering removeServerHeader="true"/>
    </security>
  </system.webServer>
  <system.web>
    <httpRuntime enableVersionHeader="false" />
  </system.web>
</configuration>

Dadurch werden der Server-Header und die X-Header entfernt.

Dies funktionierte lokal in meinen Tests in Visual Studio 2015.

Eric Dunaway
quelle
6
Das Hinzufügen von removeServerHeader = "true" gab mir einen 500-Fehler in meiner ASP.NET 4.5.3-App
Rocklan
4
@LachlanB Dies wurde in IIS 10 hinzugefügt: IIS 10.0 hat das Attribut removeServerHeader hinzugefügt, um das Senden des HTTP-Server-Headers an Remoteclients zu unterdrücken. Quelle: iis.net/configreference/system.webserver/security/…
SynerCoder
1
Ich finde es toll, dass die Azure-Seite eher Screenshots als Codeblöcke enthält. Sie tun buchstäblich alles, um das Entfernen dieser unnötigen und potenziell gefährlichen Tags so schwierig wie möglich zu machen. Ich kann auch nicht glauben, dass ich mich auf eine drei Jahre alte SO-Frage beziehe, um dieses Problem zu beheben, das keine Anzeichen für eine Korrektur aufweist.
Killa-Byte
1
Ich denke, dass diese Web.config den X-AspNetMvc-Version-Header nicht entfernt. Um diesen zu entfernen, müssen wir etwas in Global.asax stackoverflow.com/a/20739875/1678525
Jan H
8

In Asp.Net Core können Sie die web.config-Dateien folgendermaßen bearbeiten:

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

Sie können den Server-Header in den Kestrel-Optionen entfernen:

            .UseKestrel(c =>
            {
                // removes the server header
                c.AddServerHeader = false;
            }) 
Darxtar
quelle
5

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

Meine Meinung dazu:

<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>
Mitaka
quelle
4

Der Vollständigkeit halber gibt es eine andere Möglichkeit, das zu entfernen Server Header mithilfe von regedit .

Siehe diesen MSDN-Blog .

Erstellen Sie einen DWORD-Eintrag mit dem Namen DisableServerHeader im folgenden Registrierungsschlüssel und setzen Sie den Wert auf 1.

HKLM \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parameters

Ich würde lieber eine geeignete Lösung mit der Datei Web.config finden, aber die Verwendung <rewrite>ist nicht gut, da das Umschreibemodul installiert werden muss, und selbst dann wird der Header nicht wirklich entfernt, sondern nur leer.

Rudey
quelle
Wenn dies funktioniert, klingt es nach einer guten Lösung für meinen Fall. Ich habe 30 Websites in verschiedenen Versionen von .net und benötige daher drei verschiedene Möglichkeiten, um die Header zu entfernen und den Code auf all diesen Websites zu aktualisieren. Ich hätte lieber eine Konfigurationseinstellung oder Registrierung, als Code ändern zu müssen.
Mike Nelson
Ich habe das vor zwei Tagen erfolgreich angewendet, funktioniert super.
Unhöflich
2

Sie können jeden Header oder irgendetwas in ändern Application_EndRequest() dies versuchen

protected void Application_EndRequest()
{
    // removing excessive headers. They don't need to see this.
    Response.Headers.Remove("header_name");
}
Emdadul Sawon
quelle
1

Der X-Powered-By-Header wird von IIS zur HTTP-Antwort hinzugefügt, sodass Sie ihn auch auf Serverebene über IIS Manager entfernen können:

Sie können die web.config direkt verwenden:

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