在 ASP.NET 中删除揭示技术堆栈的 HTTP 响应标头的最佳方法

Woo*_*lle 5 asp.net asp.net-mvc http-headers asp.net-mvc-3 iis-10

我需要从 ASP.NET MVC 3 Web 应用程序中删除以下标头。

Server
X-AspNet-Version
X-AspNetMvc-Version
X-AspNetWebPages-Version
X-Powered-By
Run Code Online (Sandbox Code Playgroud)

我发现有两个可行的选择。选项 1 更干净,实际上删除了服务器标头,但我试图找出是否有任何我应该担心的副作用。任何一个选项都比另一个更好吗?每种方法的优点/缺点是什么?

选项1

Global.asax.cs >> Application_Start()

PreSendRequestHeaders += Application_PreSendRequestHeaders;
Run Code Online (Sandbox Code Playgroud)

全局.asax.cs

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
    HttpContext.Current.Response.Headers.Remove("Server");
    HttpContext.Current.Response.Headers.Remove("X-AspNetWebPages-Version");
    HttpContext.Current.Response.Headers.Remove("X-AspNet-Version");
    HttpContext.Current.Response.Headers.Remove("X-Powered-By");
    HttpContext.Current.Response.Headers.Remove("X-AspNetMvc-Version");
}
Run Code Online (Sandbox Code Playgroud)

选项2

Web.config >> 内部<system.web>节点(删除 X-AspNet-Version)

<httpRuntime enableVersionHeader="false" />
Run Code Online (Sandbox Code Playgroud)

Web.config >> 内部<system.webServer>节点(删除 X-Powered-By)

<httpProtocol>
  <customHeaders>
    <remove name="X-Powered-By" />
  </customHeaders>
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)

Web.config >> 内部<system.webServer>节点(更改服务器的值,需要 URLRewrite)

<rewrite>
  <outboundRules rewriteBeforeCache="true">
    <rule name="Remove Server header">
      <match serverVariable="RESPONSE_Server" pattern=".+" />
      <action type="Rewrite" value="" />
    </rule>
  </outboundRules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)

Global.asax.cs >> Application_Start() (删除 X-AspNetMvc-Version 和 X-AspNetWebPages-Version)

MvcHandler.DisableMvcResponseHeader = true;
WebPageHttpHandler.DisableWebPagesResponseHeader = true;
Run Code Online (Sandbox Code Playgroud)

Bra*_*ang 1

在我看来,第二个版本很好。

根据您的描述和代码,我创建了一个测试演示,将项目发布到IIS10后,我发现响应头没有删除。您可以发现x-Powered-by仍然存在。

在此输入图像描述

此外,根据HttpApplication.PreSendRequestHeaders Event API,您可以找到以下备注:

不要将 PreSendRequestHeaders 与实现 IHttpModule 的托管模块一起使用。设置这些属性可能会导致异步请求出现问题。应用程序请求路由 (ARR) 和 websocket 的组合可能会导致访问冲突异常,从而导致 w3wp 崩溃。例如,iiscore.dll 中的 iiscore!W3_CONTEXT_BASE::GetIsLastNotification+68 导致了访问冲突异常 (0xC0000005)。