删除服务器响应标头IIS7
有没有办法从IIS7中删除“服务器”响应头? 有一些文章显示使用HttpModules我们可以达到同样的效果。 如果我们没有pipe理员权限,这将是有帮助的。 另外我不想写ISAPIfilter。
我有我的服务器的pipe理员权限。 所以我不想做以上的东西。 所以,请帮助我也这样做。
将此添加到您的global.asax.cs中:
protected void Application_PreSendRequestHeaders() { Response.Headers.Remove("Server"); Response.Headers.Remove("X-AspNet-Version"); Response.Headers.Remove("X-AspNetMvc-Version"); }
在IIS7中,您必须使用HTTP模块。 在VS中构build以下类库:
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中对其进行configuration(如果在IIS中进行configuration,程序集必须位于GAC中)。
<configuration> <system.webServer> <modules> <add name="CustomHeaderModule" type="StrongNamespace.HttpModules.CustomHeaderModule" /> </modules> </system.webServer> </configuration>
使用IIS UrlRewrite 2.0
<outboundRules> <rule name="Remove RESPONSE_Server" > <match serverVariable="RESPONSE_Server" pattern=".+" /> <action type="Rewrite" value="" /> </rule> </outboundRules>
斯科特·米切尔(Scott Mitchell)在博客文章中提供了删除不必要的标题
正如在其他答案中已经说过的那样,对于Server
头,有http模块解决scheme或UrlScan模块。 (URLScan模块在IIS7.5 +中不再可用,使用URLRewrite来代替它) 。
对于X-AspNet-Version
和X-AspNetMvc-Version
,他提供了比在每个响应中删除它们更好的方法:根本不生成它们。
在web.config中使用enableVersionHeader
来禁用X-AspNet-Version
<httpRuntime enableVersionHeader="false" />
.Net Application_Start事件中使用MvcHandler.DisableMvcResponseHeader
以禁用X-AspNetMvc-Version
MvcHandler.DisableMvcResponseHeader = true;
最后,在IISconfiguration中删除X-Powered-By
自定义标题。
不要忘记,应用程序代码的解决scheme默认情况下不适用于在静态内容上生成的头文件(您可以激活runAllManagedModulesForAllRequests
来更改该文件,但会导致所有请求运行.Netpipe道)。 这不是X-AspNetMvc-Version
的问题,因为它不会被添加到静态内容中(至less如果静态请求不在.Netpipe道中运行)。
注意:当目标是掩饰使用的技术时,您还应该更改标准.Net cookie名称( .ASPXAUTH
如果表单auth已激活(在web.config中使用forms
标签上的name
属性), ASP.NET_SessionId
(使用<sessionState cookieName="yourName" />
在web.config下的system.web
标签), __RequestVerificationToken
(通过代码__RequestVerificationToken
改变它,但不幸的是不适用于这个系统在html中生成的隐藏input))。
实际上,上面显示的编码模块和Global.asax示例仅适用于有效的请求。
例如,在你的URL的末尾添加<,你会得到一个“错误的请求”页面,仍然暴露服务器头。 很多开发者忽略了这一点。
显示的registry设置也不起作用。 URLScan是删除“服务器”头的唯一方法(至less在IIS 7.5中)。
或者在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>
除了URL重写的答案 ,这里是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重写
要删除Server:
头,转到Global.asax
,find/创buildApplication_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"); } } }
如果您想要一个完整的解决scheme来删除Azure / IIS7上的所有相关头文件,并且也可以与Cassini一起使用,请参阅此链接 , 该链接显示了在不使用HttpModules或URLScan的情况下禁用这些头文件的最佳方法。
如果你只是想删除标题,你可以使用一个缩短版本的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>
尝试将HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeader
registry项设置为1
的REG_DWORD
。
UrlScan也可以通过在[options]
下使用AlternateServerName=
来删除服务器头。
根据eddiegroves的回答 ,根据URLScan的版本,您可能更喜欢RemoveServerHeader=1
[options]
。
我不确定在哪个版本的URLScan中添加了这个选项,但它已经在版本2.5和更高版本中可用。
我find了一篇文章,解释了为什么我们需要进行registry编辑,并使用UrlScan等工具在IIS中正确设置。 我遵循它在我们的服务器上,它的工作原理: http : //blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx 。 如果您只使用UrlScan,但不执行registry更改,则在停止World Wide Publishing服务期间,服务器将从HTTP.sys文件返回服务器http响应。 此外,这里是使用UrlScan工具常见的秘密: http : //msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008
在IIS 10中,我们对Drew的方法使用了类似的解决scheme,即:
using System; using System.Web; namespace Common.Web.Modules.Http { /// <summary> /// Sets custom headers in all requests (eg "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的引用,以及你想要的configuration中的模块:
<system.webServer> <modules> <!--Use http module to remove/customize IIS "Server" header--> <add name="CustomHeaderModule" type="Common.Web.Modules.Http.CustomHeaderModule" /> </modules> </system.webServer>