Dans le cadre d'un effort visant à sécuriser davantage notre API et notre site, je supprime les en-têtes qui contiennent des informations sur les activités du site.
Exemple avant de supprimer les en-têtes:
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 05 Jun 2013 00:27:54 GMT
Content-Length: 3687
Web.config:
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
Global.asax.cs:
protected void Application_PreSendRequestHeaders() {
Response.Headers.Remove("Server");
Response.Headers.Remove("X-AspNet-Version");
Response.Headers.Remove("X-AspNetMvc-Version");
Response.AddHeader("Strict-Transport-Security", "max-age=300");
Response.AddHeader("X-Frame-Options", "SAMEORIGIN");
}
Et après cela, tous les appels sur le site et l'API renvoient des en-têtes plus sûrs, comme ceci:
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Wed, 05 Jun 2013 00:27:54 GMT
Content-Length: 3687
Jusqu'ici tout va bien. Cependant, j'ai remarqué dans Firebug que si vous regardez le contenu statique (loading.gif, par exemple), il inclut toujours l'en-tête du serveur.
HTTP/1.1 304 Not Modified
Cache-Control: no-cache
Accept-Ranges: bytes
Etag: "a3f2a35bdf45ce1:0"
Server: Microsoft-IIS/8.0
Date: Tue, 25 Jun 2013 18:33:16 GMT
Je suppose que cela est en quelque sorte géré par IIS, mais je ne trouve nulle part où supprimer cet en-tête. J'ai essayé d'ajouter:
<remove name="Server" />
dans la section httpProtocol/customHeaders de Web.config, comme indiqué ci-dessus. J'ai également essayé d'accéder à la section En-têtes de réponse HTTP du gestionnaire IIS et à l'ajout d'une fausse paire nom/valeur pour l'en-tête du serveur. Dans les deux cas, il retourne toujours
Server: Microsoft-IIS/8.0
lors du chargement des images, CSS ou JS. Où/que dois-je définir quelque chose pour résoudre ce problème?
Vous devriez pouvoir forcer toutes les demandes à passer par votre code managé en ajoutant ceci à votre webconfig:
<modules runAllManagedModulesForAllRequests="true">
Ensuite, même les fichiers statiques doivent adhérer à vos règles d’en-tête.
De la même manière que dans cette réponse et dans ce site Web: , vous devez suivre les étapes suivantes:
C #:
namespace MvcExtensions.Infrastructure
{
public class CustomServerName : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += OnPreSendRequestHeaders;
}
public void Dispose() { }
void OnPreSendRequestHeaders(object sender, EventArgs e)
{
HttpContext.Current.Response.Headers.Remove("Server");
}
}
}
Web.config:
<system.webServer>
<modules>
<add name="CustomHeaderModule" type="MvcExtensions.Infrastructure.CustomServerName" />
</modules>
</system.webServer>
Malheureusement, les modules de code gérés ne fonctionnent que pour le code passant par le pipeline ASP.NET, alors que d'autres ont correctement suggéré qu'il était possible de forcer toutes les demandes via du code géré. Personnellement, j'estime que cela n'est pas souhaitable.
Afin de supprimer les en-têtes de toutes les demandes, y compris le contenu statique, qui est par défaut servi directement et non via le code géré, il est possible d'utiliser un module de code natif. Malheureusement, les modules Native-Code sont un peu plus difficiles à écrire car ils utilisent les API win32 plutôt qu'ASP.NET, mais d'après mon expérience, ils sont beaucoup plus adaptés à la suppression des en-têtes.
Le lien suivant contient les fichiers binaires et le code source d'un module de code natif pouvant être utilisé pour supprimer les en-têtes. Aucune configuration supplémentaire n'est nécessaire pour supprimer les en-têtes "Serveur", mais d'autres en-têtes à supprimer peuvent être ajoutés dans la configuration IIS.
http://www.dionach.com/blog/easily-remove-unwanted-http-headers-in-iis-70-to-85
Le seul sans solution facile à énumérer était l'en-tête "Server". J'ai pu le supprimer localement dans IIS et sur un site Web Azure en l'ajoutant dans le fichier web.config.
<system.webServer>
<security>
<requestFiltering removeServerHeader="true" />
</security>
</system.webServer>
Utilisez IIS UrlRewrite 2.0 pour effacer l'en-tête de réponse du serveur. Ajouter le code suivant dans le fichier Web.config
<system.webServer>
<rewrite>
<outboundRules>
<rule name="Remove RESPONSE_Server" >
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
Aucune des solutions ici ne fonctionnait correctement pour moi.
Ma solution simple consistait à ajouter ceci à mon fichier web.config
:
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="Server" />
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>