Angreifern sollte man möglichst wenig Informationen an die Hand geben. Standardmäßig ist aber eine ASP.NET MVC Website auf einem IIS schon ein klein wenig gesprächig.
In jeder Response wird (solange nichts anderes im IIS eingestellt wurde), die IIS Version mitgesendet. Auch die ASP.NET MVC und ASP.NET Version ist in der Response enthalten wenn die ASP.NET Pipeline berührt wurde.
Was ist an den Standard-Headern so schlecht?
Es gibt Szenarien, da macht das durchaus Sinn die Herkunft der Webantwort zu verschleiern, auch wenn die Default-Werte “recht grob” sind. Problematisch wird es, wenn direkt für die ASP.NET Version 4.0.30319 eine Sicherheitslücke auftaucht. Daher die Idee, alles nicht benötigte abzuschalten. Netter Nebeneffekt: Man spart noch ein paar Byte ein.
Herangehensweise: Vermutlich kann man einige Optionen auch direkt im IIS setzen, ich habe allerdings gern diese “Einstellungen” in meiner Applikation, sodass ich keinem Admin noch ein Handbuch hinterher werfen muss.
ASP.NET MVC Header deaktivieren
Der ASP.NET MVC Header kann in der Global.asax mit “MvcHandler.DisableMvcResponseHeader” deaktiviert werden:
protected void Application_Start() { MvcHandler.DisableMvcResponseHeader = true; AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }
ASP.NETA Version Header deaktivieren
Wichtig hier ist, dass die Anwendung im IIS (unter den AppPools) als Integrated Pipeline bzw. während der Entwicklung mindestens auf IIS Express läuft:
Diese Einstellungen in der Web.config haben bei mir jeddenfalls das gewünschte Ergebnis erzielt:
<?xml version="1.0"?> <configuration> <system.web> <httpRuntime enableVersionHeader="false" /> ... </system.web> <system.webServer> ... <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> </httpProtocol> </system.webServer> ... </configuration>
Server Response Header entfernen
Dieses Flag ist am “schwierigsten” zu entfernen und benötigt ein HttpModule, welches diesen Header entweder entfernt oder manipuliert:
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"); } }
Registrierung in der Web.config:
<?xml version="1.0"?> <configuration> ... <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules runAllManagedModulesForAllRequests="true"> <add name="RemoveServerHeaderModule" type="SecurityTipp.RemoveServerHeaderModule"/> </modules> ... </system.webServer> </configuration>
Quellen
Wie immer dank an Stackoverflow und diesem Link.