删除服务器响应头 IIS7

有没有办法从 IIS7中删除“服务器”响应头?有一些文章表明,使用 HttpModule 我们可以实现同样的功能。如果我们没有管理员对服务器的权限,这将是有帮助的。我也不想写 ISAPI 过滤器。

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

164822 次浏览

In IIS7 you have to use an HTTP module. Build the following as a class library in 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>

UrlScan can also remove the server header by using AlternateServerName= under [options].

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

如果你只是想删除标题,你可以使用 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>

跟踪 Eddiegroves 的回答,取决于 URLScan 的版本,您可能更喜欢 [options]下的 RemoveServerHeader=1

我不确定在哪个版本的 URLScan 中添加了这个选项,但是它已经在2.5版本和更高版本中可用了。

把这个添加到 global.asax.cs:

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

启用 URL Rewrite Module Version 2.0 for IIS (UrlRewrite)后,在配置部分 <configuration> something <system.webServer> something <rewrite>中添加出站规则:

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

要删除 Server:头文件,转到 Global.asax,查找/创建 Application_PreSendRequestHeaders事件并添加如下代码行(感谢 BK这个博客,这在 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,请参阅 这个链接,它展示了不使用 HttpModule 或 URLScan 禁用这些头文件的最佳方法。

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

例如,在 URL 的末尾添加 < ,您将得到一个“ Bad request”页面,该页面仍然暴露服务器头。很多开发人员忽视了这一点。

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

Scott Mitchell 在一篇博文中提供了 删除不必要的标题的解决方案。

正如在其他答案中已经说过的,对于 Server头,有一个 http module solution,或者一个 针对 IIS10 + 的 web.config 解决方案,或者你可以使用 而是重写 URLRewrite 来消除它

对于这个 Server头文件,最实用的最新(IIS 10 +)设置解决方案是在 web.config 中使用 removeServerHeader:

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

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

Use enableVersionHeader for disabling X-AspNet-Version, in web.config

<system.web>
...
<httpRuntime enableVersionHeader="false" />
...
</system.web>

在.Net Application _ Start 事件中使用 MvcHandler.DisableMvcResponseHeader禁用 X-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true;

And finally, remove in IIS configuration the X-Powered-By custom header in web.config.

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

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

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

旁注: 当目的是为了掩盖使用过的技术时,你也应该改变标准。Net cookie 名称(如果表单 auth 被激活,则为 .ASPXAUTH(在 web.config 中使用 forms标签上的 name属性) ,ASP.NET_SessionId(在 web.config 中使用 system.web标签下的 <sessionState cookieName="yourName" />) ,__RequestVerificationToken(使用 AntiForgeryConfig.CookieName代码更改,但不幸的是不适用于系统在 html 中生成的隐藏输入)。

或者添加 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>

我找到了一篇文章,解释了为什么我们需要进行注册表编辑并使用 UrlScan 之类的工具来在 IIS 中正确地设置注册表。我在我们的服务器上跟踪了它,它运行正常: http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx。如果只使用 UrlScan 但不更改注册表,在停止 World Wide Publishing Service 期间,服务器将从 HTTPsys 文件返回服务器 http 响应。此外,以下是使用 UrlScan 工具的常见缺陷: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008

除了 重写答案之外,这里还有 web.config的完整 XML

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

URL 重写

在 IIS10中,我们使用了与 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) ;

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

I got hung up for a bit because I forgot to clear my browser cache after making config changes. If you don't do that and the file is in your local cache, it will serve it back to you with the original headers (duh).

我通过 removing的 runAllManagedModulesForAllRequest 得到了它的大部分工作:

<modules runAllManagedModulesForAllRequests="true">

这样就从静态文件的 大部分中删除了多余的头文件,但是我仍然在我的 WebAPI 项目中得到一些静态文件的“ Server”头文件。

我最终找到并应用了这个解决方案,现在不需要的标题 所有不见了:

Https://www.dionach.com/en-au/blog/easily-remove-unwanted-http-headers-in-iis-7-0-to-8-5/

这里讨论了他的代码:

Https://github.com/dionach/stripheaders/releases/tag/v1.0.5

这是一个原生代码模块。它能够 拿开服务器头,而不仅仅是空白的值。默认情况下,它删除:

  • 服务器
  • X-Power-By
  • X-Aspnet-Version
  • 服务器: Microsoft-HTTPAPI/2.0——如果“请求未能传递给 IIS”,将返回该服务器

我已经研究过这个问题,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"

This web.config setup works to remove all unnecessary headers from the ASP.NET response (at least starting from IIS 10):

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


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


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

Please note that this hides all the headers for the "application", as do all the other approaches. If you e.g. reach some default page or an error page generated by the IIS itself or ASP.NET outside your application these rules won't apply. So ideally they should be on the root level in IIS and that sill may leave some error responses to the IIS itself.

附言。IIS10中有一个 bug,即使配置正确,它有时也会显示服务器头。现在应该修复了,但是 IIS/Windows 必须更新。

You can add below code in Global.asax.cs file

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

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

与其他一些方法不同,这不会导致性能损失。标头也从所有请求中删除,甚至从内部错误中删除。

上面提出的解决方案结合以下变化对我有效。这里我张贴我的方案和解决方案。

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

  • 服务器
  • X-Power-By
  • X-AspNet-Version
  • 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>

希望能有帮助!