删除服务器响应标头IIS7

时间:2009-07-24 16:47:48

标签: security iis-7 header response

有没有办法从IIS7中删除“服务器”响应头?有一些文章显示使用HttpModules我们可以实现同样的目的。如果我们没有服务器的管理权限,这将非常有用。我也不想写ISAPI过滤器。

我拥有服务器的管理员权限。所以我不想做上面的事情。所以,请帮我做同样的事。

19 个答案:

答案 0 :(得分:102)

将此添加到您的global.asax.cs:

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}

答案 1 :(得分:76)

在IIS7中,您必须使用HTTP模块。在VS中构建以下类库:

namespace StrongNamespace.HttpModules
{
  public class CustomHeaderModule : IHttpModule
  { 
    public void Init(HttpApplication context)
    {
      context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    } 

    public void Dispose() { } 

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
      HttpContext.Current.Response.Headers.Set("Server", "Box of Bolts");
    }
  }
}

然后将以下内容添加到您的web.config中,或者在IIS中进行配置(如果在IIS中进行配置,则程序集必须位于GAC中)。

<configuration>
  <system.webServer>
    <modules>
      <add name="CustomHeaderModule"
       type="StrongNamespace.HttpModules.CustomHeaderModule" />
    </modules>
  </system.webServer>
</configuration>

答案 2 :(得分:36)

使用IIS UrlRewrite 2.0

<outboundRules>
  <rule name="Remove RESPONSE_Server" >
    <match serverVariable="RESPONSE_Server" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>

答案 3 :(得分:27)

Scott Mitchell在博客文章中提供了removing unnecessary headers的解决方案。

正如其他答案中所述,对于Server标题,有http module solution或UrlScan模块。 (IIS7.5 +中不再提供URLScan模块。使用URLRewrite instead for blanking it。)

对于X-AspNet-VersionX-AspNetMvc-Version,他提供了一种比在每个回复中删除它们更好的方法:根本不生成它们。

在web.config

中使用enableVersionHeader禁用X-AspNet-Version
<httpRuntime enableVersionHeader="false" />

在.Net Application_Start事件中使用MvcHandler.DisableMvcResponseHeader来禁用X-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true;

最后,在IIS配置中删除X-Powered-By自定义标头。 (这可以在web.config,configuration/system.webServer/httpProtocol/customHeaders/remove[name=X-Powered-By]

中完成

请注意,如果您有ARR(应用程序请求路由),它还会添加自己的X-Powered-By,自定义标头设置不会删除它。必须通过IIS根管理器上的IIS管理器,编辑器配置(不在站点上)删除此项目:转到system.webServer/proxy节点并将arrResponseHeader设置为false。在IISReset之后,会将其考虑在内 (我发现了这个here,除了这篇文章是关于旧IIS 6.0配置事物的方式。)

不要忘记应用程序代码的解决方案默认情况下不适用于在静态内容上生成的标头(您可以激活runAllManagedModulesForAllRequests来更改它,但它会导致所有请求运行.Net管道)。这不是X-AspNetMvc-Version的问题,因为它没有添加到静态内容上(至少如果静态请求不在.Net管道中运行)。

附注:当目标是隐藏使用过的技术时,如果表单已激活(在.ASPXAUTH标记上使用name属性,则还应更改标准.Net Cookie名称(forms) web.config),ASP.NET_SessionId(在<sessionState cookieName="yourName" />代码下的web.config中使用system.web__RequestVerificationToken(使用代码AntiForgeryConfig.CookieName进行更改,但遗憾的是不适用于此系统在html中生成的隐藏输入))。

答案 4 :(得分:18)

实际上,上面显示的编码模块和Global.asax示例仅适用于有效请求。

例如,添加&lt;在URL的末尾,您将收到“错误请求”页面,该页面仍然显示服务器标头。许多开发人员忽视了这一点。

显示的注册表设置也不起作用。 URLScan是删除“服务器”标题的唯一方法(至少在IIS 7.5中)。

答案 5 :(得分:13)

或者添加web.config:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <remove name="X-AspNet-Version" />
            <remove name="X-AspNetMvc-Version" />
            <remove name="X-Powered-By" />
            <!-- <remove name="Server" />  this one doesn't work -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

答案 6 :(得分:10)

要删除Server:标题,请转到Global.asax,查找/创建Application_PreSendRequestHeaders事件并按如下方式添加一行(感谢BK和{{3}这也不会在Cassini / local dev上失败:

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
    // Remove the "Server" HTTP Header from response
    HttpApplication app = sender as HttpApplication;
    if (null != app && null != app.Request && !app.Request.IsLocal &&
        null != app.Context && null != app.Context.Response)
    {
        NameValueCollection headers = app.Context.Response.Headers;
        if (null != headers)
        {
            headers.Remove("Server");
        }
    }
}

如果您想要一个完整的解决方案来删除Azure / IIS7上的所有相关标头并且也可以使用Cassini,请参阅this blog,其中显示了在不使用HttpModules或URLScan的情况下禁用这些标头的最佳方法。

答案 7 :(得分:9)

如果您只想删除标题,可以使用缩短版本的lukiffer答案:

using System.Web;

namespace Site
{
    public sealed class HideServerHeaderModule : IHttpModule
    {
        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders +=
            (sender, e) => HttpContext.Current.Response.Headers.Remove("Server");
        }
    }
}

然后在Web.config

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHeaderModule" type="Site.HideServerHeaderModule" />
  </modules>
</system.webServer>

答案 8 :(得分:8)

web.config安装程序可从ASP.NET响应(至少从IIS 10开始)中删除所有不必要的标头:

<!--Removes version headers from response -->
<httpRuntime enableVersionHeader="false" />

<httpProtocol>
  <customHeaders>
    <!--Removes X-Powered-By header from response -->
    <clear />
  </customHeaders>
</httpProtocol>

<security>
  <!--Removes Server header from response-->
  <requestFiltering removeServerHeader ="true" />
</security>

请注意,这将隐藏“应用程序”的所有标头,其他所有方法也是如此。如果您例如到达某些默认页面或由IIS本身或应用程序外部的ASP.NET生成的错误页面,这些规则将不适用。因此,理想情况下,它们应该位于IIS的根级别,并且该底线可能会对IIS本身留下一些错误响应。

P.S。 IIS 10中有一个bug,即使使用正确的配置,它有时也会显示服务器标头。现在应该修复它,但是必须更新IIS / Windows。

答案 9 :(得分:5)

尝试将HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeader注册表项设置为REG_DWORD的{​​{1}}。

答案 10 :(得分:4)

UrlScan 也可以使用AlternateServerName=下的[options]删除服务器标头。

答案 11 :(得分:2)

我发现了一篇文章解释了为什么我们需要同时执行注册表编辑并使用UrlScan等工具在IIS中正确设置。我在我们的服务器上关注它,它可以工作:http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx。如果您仅使用UrlScan但未进行注册表更改,则在停止World Wide Publishing Service期间,您的服务器将从HTTP.sys文件返回服务器http响应。此外,以下是使用UrlScan工具的常见问题:http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008

答案 12 :(得分:2)

在IIS 10中,我们使用与Drew方法类似的解决方案,即:

using System;
using System.Web;

namespace Common.Web.Modules.Http
{
    /// <summary>
    /// Sets custom headers in all requests (e.g. "Server" header) or simply remove some.
    /// </summary>
    public class CustomHeaderModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

        public void Dispose() { }

        /// <summary>
        /// Event handler that implements the desired behavior for the PreSendRequestHeaders event,
        /// that occurs just before ASP.NET sends HTTP headers to the client.
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            //HttpContext.Current.Response.Headers.Remove("Server");
            HttpContext.Current.Response.Headers.Set("Server", "MyServer");
        }
    }
}

显然在你的项目中添加对该dll的引用,以及你想要的配置中的模块:

<system.webServer>
    <modules>
      <!--Use http module to remove/customize IIS "Server" header-->
      <add name="CustomHeaderModule" type="Common.Web.Modules.Http.CustomHeaderModule" />
    </modules>
</system.webServer>

重要说明1:此解决方案需要将应用程序池设置为集成;

重要说明2:网络应用程序中的所有回复都会受此影响(包括css和js);

答案 13 :(得分:2)

跟进eddiegroves' answer,取决于网址扫描的版本,您可能更喜欢RemoveServerHeader=1下的[options]

我不确定在哪个版本的URLScan中添加了此选项,但它已在2.5及更高版本中提供。

答案 14 :(得分:1)

上面提出的解决方案结合以下方面为我工作。我在这里发布我的方案和解决方案。

对我来说,我想删除以下标头:

  • 服务器
  • X-Powered-By
  • X-AspNet版本
  • X-AspNetMvc-版本

我将这些添加到了global.asax:

<%@ Application Language="C#" %>
<script runat="server">
    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
        Response.Headers.Remove("X-Powered-By");
        Response.Headers.Remove("X-AspNet-Version");
        Response.Headers.Remove("X-AspNetMvc-Version");
    }
</script>

上述事件未触发,因此我在web.config中添加了以下内容,然后它起作用了。

<modules runAllManagedModulesForAllRequests="true" />

为了删除版本标头,我还在web.config中添加了以下内容:

<httpRuntime enableVersionHeader="false" />

web.config中的更改:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
    <system.web>
        <httpRuntime enableVersionHeader="false" />
    </system.web>
</configuration>

希望有帮助!

答案 15 :(得分:0)

我尝试了所有这些东西以及其他几个类似的堆栈溢出线程。

我挂了一会儿,因为我在进行配置更改后忘了清除浏览器缓存。如果您不这样做并且该文件位于本地缓存中,它将使用原始标头(duh)将其提供给您。

我得到的主要是删除 runAllManagedModulesForAllRequests:

<modules runAllManagedModulesForAllRequests="true">

这从静态文件的大多数中删除了多余的标题,但我仍然得到了&#34; Server&#34; swagger中我的WebAPI项目中的一些静态文件的标题。

我终于找到并应用了此解决方案,现在所有不需要的标头都消失了:

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

讨论了他的代码:

https://github.com/Dionach/StripHeaders/releases/tag/v1.0.5

这是Native-Code模块。它能够删除服务器标头,而不仅仅是清空值。默认情况下,它会删除:

  • 服务器
  • X供电-通过
  • X-ASPNET-版
  • 服务器:Microsoft-HTTPAPI / 2.0 - 如果&#34;请求无法传递给IIS&#34;
  • 将返回

答案 16 :(得分:0)

我研究了这个并且URLRewrite方法效果很好。似乎无法在任何地方找到更改的脚本。我写了这与PowerShell v2及更高版本兼容,并在IIS 7.5上进行了测试。

# Add Allowed Server Variable
    Add-WebConfiguration /system.webServer/rewrite/allowedServerVariables -atIndex 0 -value @{name="RESPONSE_SERVER"}
# Rule Name
    $ruleName = "Remove Server Response Header"
# Add outbound IIS Rewrite Rule
    Add-WebConfigurationProperty -pspath "iis:\" -filter "system.webServer/rewrite/outboundrules" -name "." -value @{name=$ruleName; stopProcessing='False'}
#Set Properties of newly created outbound rule 
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "serverVariable" -value "RESPONSE_SERVER"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "pattern" -value ".*"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/action" -name "type" -value "Rewrite"

答案 17 :(得分:0)

您可以在Global.asax.cs文件中添加以下代码

    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
    }

答案 18 :(得分:-1)

IIS 7.5及更高版本可能将标题文本存储在iiscore.dll

使用十六进制编辑器,在其后找到字符串和单词“ Server” 53 65 72 76 65 72,并将其替换为空字节。在IIS 7.5中,它看起来像这样:

4D 69 63 72 6F 73 6F 66 74 2D 49 49 53 2F 37 2E 35 00 00 00 53 65 72 76 65 72 

与其他方法不同,这不会导致性能下降。标头也会从所有请求中删除,即使是内部错误也是如此。