34

作为使我们的 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

网络配置:

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

全球.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 时。我需要在哪里/什么设置一些东西来解决这个问题?

4

5 回答 5

14

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

<system.webServer>
  <security>
    <requestFiltering removeServerHeader="true" />
  </security>
</system.webServer>
于 2018-03-23T19:31:44.410 回答
12

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

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

网络配置:

<system.webServer>
   <modules>
      <add name="CustomHeaderModule" type="MvcExtensions.Infrastructure.CustomServerName" />
   </modules>
</system.webServer>
于 2013-12-02T19:29:18.080 回答
9

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

<modules runAllManagedModulesForAllRequests="true">

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

于 2013-06-25T18:51:33.557 回答
9

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

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

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

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

于 2014-04-12T11:42:19.857 回答
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

于 2016-03-22T13:28:43.983 回答