在没有UrlScan的情况下删除/隐藏/禁用Azure / IIS7中过多的HTTP响应标头

时间:2012-10-09 16:01:43

标签: asp.net iis-7 azure penetration-testing response-headers

我需要删除excessive headers(主要是为了通过渗透测试)。我花时间研究了涉及运行UrlScan的解决方案,但这些问题很麻烦UrlScan needs to be installed each time an Azure instance is started

Azure必须有一个很好的解决方案,不涉及从startup.cmd部署安装程序。

我了解响应标头已添加到different places

  • 服务器:由IIS添加。
  • X-AspNet-Version :在HttpResponse类的Flush时由System.Web.dll添加
  • X-AspNetMvc-Version :由System.Web.dll中的MvcHandler添加。
  • X-Powered-By :由IIS添加

有没有办法配置(通过web.config等?)IIS7删除/隐藏/禁用HTTP响应头以避免过多的标题" asafaweb.com处的警告,无需创建IIS模块或部署每次Azure实例启动时需要运行的安装程序?

5 个答案:

答案 0 :(得分:135)

以下更改允许您在Azure 中删除这些HTTP响应标头,而无需编写自定义HttpModule。

网上的大多数信息已过期,并涉及UrlScan(此后已集成到IIS7中,但删除了RemoveServerHeader=1选项)。以下是我发现的最佳解决方案(感谢this blogthis answerthis blog合并而成。)

要删除服务器,请转到Global.asax,查找/创建Application_PreSendRequestHeaders事件并添加以下内容(感谢BK和{{3}这也不会在Cassini / local dev上失败:

2014年4月编辑:您可以将PreSendRequestHeaders和PreSendRequestContext事件与本机IIS模块一起使用,但不要将它们与实现IHttpModule的托管模块一起使用。设置这些属性可能会导致this blog出现问题。正确的版本是使用BeginRequest事件。

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var application = sender as HttpApplication;
        if (application != null && application.Context != null)
        {
            application.Context.Response.Headers.Remove("Server");
        }
    }

要删除 X-AspNet-Version ,请在web.config中找到/创建<system.web>并添加:

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

    ...

要删除 X-AspNetMvc-Version ,请转到Global.asax,查找/创建Application_Start事件并添加一行,如下所示:

  protected void Application_Start()
  {
      MvcHandler.DisableMvcResponseHeader = true;
  }

要删除 X-Powered-By ,请在web.config中找到/创建<system.webServer>并添加:

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

    ...

答案 1 :(得分:10)

MSDN发布了this article有关如何隐藏Azure网站上的标头的信息。您现在可以通过向system.webServer

添加条目来从web.config隐藏服务器
<security>
      <requestFiltering removeServerHeader ="true" />
</security>

VS会在上面皱眉但是无效。上面的链接有代码作为图片,很难找到。 如上所述,MVC版本仍然隐藏在应用程序启动中,对于x-powered-by和.Net版本也是如此。

答案 2 :(得分:6)

NuGet上还有一个软件包可以帮助您通过几行配置实现这一点,而无需更改代码:NWebsec。有关删除版本标头的文档,请访问:https://github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers

在此演示:http://www.nwebsec.com/HttpHeaders/VersionHeaders(在Azure中)

免责声明:我是该项目的开发人员。

答案 3 :(得分:5)

Nick Evans&#39;答案很完美,但是......

如果您为安全目的删除这些标头,请不要忘记更改ASP.NET Session coockie name! 因为当您看到它时,更容易猜测使用的语言或服务器版本:

enter image description here

更改Cookie名称:(有创意)

<system.web>
  <sessionState cookieName="PHPSESSID" />
</system.web>

答案 4 :(得分:3)

汇总@ giveme5minutes和@AKhooli之前的答案,因为它们与Azure网站以及扫描仪想要查看的其他一些项目有关,这些是我为使ASafaWeb满意Azure站点所做的更改。

它仍抱怨Azure亲和力标头cookie不仅仅是https,但亲和力是你想要重播的cookie的类型,对吗?

<system.web>
    <compilation debug="false">
    <httpRuntime enableVersionHeader="false" />
    <httpCookies httpOnlyCookies="true" requireSSL="true" />    
    <customErrors mode="RemoteOnly" defaultRedirect="~/Error.aspx" />
</system.web>

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="X-Frame-Options" value="DENY" />
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
    <security>
      <!--removes Azure headers-->
      <requestFiltering removeServerHeader="true" />
    </security>
</system.webServer>