正在从IIS 7/8中的静态内容中删除服务器标头

本文关键字:删除 服务器 静态 IIS | 更新日期: 2023-09-27 18:19:56

作为使API和站点更加安全的努力的一部分,我将删除泄漏站点运行信息的头。

剥离集管之前的示例:

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

之后,所有对站点和API的调用都会返回更安全的头,比如:

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

到目前为止,一切都很好。然而,我在Firebug中注意到,如果您查看静态内容(例如loading.gif),它仍然包括服务器标头。

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

我假设这是由IIS以某种方式处理的,但找不到任何地方可以删除该标头。我试着添加:

<remove name="Server" /> 

到Web.config中的httpProtocol/customHeaders部分,如上所述。我还尝试过进入IIS管理器的HTTP响应标头部分,并为服务器标头添加一个假名称/值对。在这两种情况下,它仍然返回

Server: Microsoft-IIS/8.0

加载任何图像、CSS或JS时。我需要在哪里/做些什么来解决这个问题?

正在从IIS 7/8中的静态内容中删除服务器标头

唯一没有简单列出的解决方案的是"Server"标头。我能够在IIS和Azure网站中本地删除它,方法是将其添加到web.config 中

<system.webServer>
  <security>
    <requestFiltering removeServerHeader="true" />
  </security>
</system.webServer>

与此答案和此网站中的方法相同,您应该使用以下步骤:

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>

您应该能够通过将托管代码添加到您的webconfig:来强制所有请求通过托管代码

<modules runAllManagedModulesForAllRequests="true">

然后,即使是静态文件也应该遵守头部规则。

不幸的是,托管代码模块只适用于通过ASP.NET管道的代码,而其他人则正确地建议可以强制所有请求通过托管代码,我个人认为这是不可取的。

为了从所有请求中删除标头,包括静态内容,默认情况下,静态内容是直接提供的,而不是通过托管代码提供的,可以使用Native code模块。不幸的是,本机代码模块的编写有点困难,因为它们使用win32 API而不是ASP.NET,但根据我的经验,它们更适合删除标头。

以下链接包含可用于删除标头的本机代码模块的二进制文件和源代码。删除"服务器"标头不需要额外的配置,但可以在IIS配置中添加其他要删除的标头。

http://www.dionach.com/blog/easily-remove-unwanted-http-headers-in-iis-70-to-85

使用IIS UrlRewrite 2.0来清空服务器响应标头。在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>

https://stackoverflow.com/a/12615970/5810078