【问题标题】:Removing Server header from static content in IIS 7/8从 IIS 7/8 中的静态内容中删除服务器标头
【发布时间】:2013-06-22 17:08:22
【问题描述】:

为了使我们的 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 时。我需要在哪里/做什么来解决这个问题?

【问题讨论】:

    标签: c# asp.net security iis http-headers


    【解决方案1】:

    唯一没有简单列出解决方案的是“服务器”标题。通过在 web.config 中添加它,我可以在 IIS 和 Azure 网站中本地删除它

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

    【讨论】:

    • 不幸的是,这只适用于IIS 10.0+,并且OP在问题标题中表示他的情况涉及IIS 7/8。
    【解决方案2】:

    this answerthis website: 中的方法相同,您应该使用以下步骤:

    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>
    

    【讨论】:

    【解决方案3】:

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

    <modules runAllManagedModulesForAllRequests="true">
    

    那么,即使是静态文件也应该遵守您的标头规则。

    【讨论】:

    • 谢谢,效果很好。一般来说,这样做在速度方面有什么可担心的吗?对于我们的应用程序/API,它的受众非常有限,内容被缓存,查询占据了响应大小/时间的最大份额,所以我并不担心。很高兴知道。
    • 启动整个 ASP.Net 堆栈以提供静态文件将更加占用资源,这就是默认情况下不这样做的原因。但是根据您的情况,似乎付出的代价是值得的。
    • 这个对另一个问题 (stackoverflow.com/a/12615970/64203) 的回复实际上不需要打满堆栈,所以我最终决定使用它作为我的最终解决方案,但再次感谢您的帮助。跨度>
    • 你不应该使用它。太浪费资源了:britishdeveloper.co.uk/2010/06/…
    • 这对静态文件/304 响应没有影响。我已经完成了所有这些步骤,但是当浏览器请求静态文件并且服务器返回 304 Not Modified 时,“Server”标头仍然存在。
    【解决方案4】:

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

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

    以下链接包含可用于删除标头的 Native-Code 模块的二进制文件和源代码。删除“Server”标头不需要额外配置,但可以在 IIS 配置中添加其他要删除的标头。

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

    【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 感谢您提供简洁而正确的答案。互联网上挤满了为此提供错误答案的人,或者只是告诉您不要担心泄露服务器版本。
    • 这为我在 Microsoft-IIS/10.0 上解决了问题
    猜你喜欢
    • 2022-10-06
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2010-12-28
    • 2021-06-13
    • 2014-04-19
    相关资源
    最近更新 更多