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


86

我需要删除过多的标题(主要是为了通过渗透测试)。我花了很多时间研究涉及运行UrlScan的解决方案,但是这些解决方案很麻烦,因为每次启动Azure实例时都需要安装UrlScan

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

我知道响应标头添加在不同的位置

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

有什么方法可以配置(通过web.config等?)IIS7来删除/隐藏/禁用HTTP响应标头,从而避免在asafaweb.com上出现“标头过多”警告,而无需创建IIS模块或部署需要安装的安装程序。每次启动Azure实例时都可以运行?

Answers:


139

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

网上的大多数信息都已过时,涉及UrlScan(此后已集成到IIS7中,但已RemoveServerHeader=1删除了该选项)。以下是我找到的最简洁的解决方案(这要归功于该Blog该答案这个Blog)。

要删除Server,请转到Global.asax,找到/创建Application_PreSendRequestHeaders事件并添加以下内容(感谢BK,并且此博客在Cassini /本地开发人员上也不会失败):

2014年4月修改:您可以将PreSendRequestHeaders和PreSendRequestContext事件与本机IIS模块一起使用,但不要与实现IHttpModule的托管模块一起使用。设置这些属性可能会导致异步请求出现问题。正确的版本是使用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>

    ...

根据VS中的提示,无需对Request,Response或Response.Header进行空检查
克里斯·海恩斯

1
在IIS上使用时,Azure不知道应用程序池必须处于集成模式。并且在本地调试时应删除.IsLocal。
IvanH 2013年

5
C#中不需要“ Yoda条件”-不允许在有条件的en.wikipedia.org/wiki/Yoda_Conditions中
tvanfosson 2013年

1
感谢您提供详细的答案,但是我确实尝试了按照步骤进行操作,但是每次我使用asafweb扫描站点时,仍然会提及有关过多标头(X-AspNet-Version)的问题。我什至使用URLRewrite删除了此标头。他们还有其他删除它的可能性吗?
雷蒙德

4
仍然存在请求不存在的文件的问题,例如“ yoursite / foo.jpg ”。由于MVC不处理此请求,因此响应标头“ Server:IIS xy”仍然存在。适用于Azure网站(显然仅适用于Azure网站)的一种解决方案是将其添加到<system.webServer>下:<security xdt:Transform =“ Insert”> <requestFiltering removeServerHeader =“ true” /> </ security >
阿德里安h。

12

MSDN发表了有关如何在Azure网站上隐藏标题的文章。现在,您可以通过将条目添加到system.webServer来从web.config隐藏服务器

<security>
      <requestFiltering removeServerHeader ="true" />
</security>

VS会因为以上原因而皱眉。上面的链接具有图片的代码,很难找到。MVC版本仍在上述应用程序启动中隐藏,与x-poweredby和.Net版本相同。


3
正是我想要的。谢谢。
马丁·科斯特洛

3
这可能适用于Azure,但不适用于其他任何地方。对该文章的评论和我自己的测试一样证明了这一点。@ giveme5minutes的答案是有效的方式。
CrazyPyro

很高兴知道为实现此功能而实施了什么:| 特别是由于URL SCAN以前已经实现了此功能。
felickz 2015年

6

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

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

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


“ NWebsec可以帮助您删除几乎所有这些版本标头,即除服务器之外的所有标头:Microsoft-IIS / 8.0标头。” :( github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers
felickz 2015年

它从CodePlex上移到GitHub上(请更新链接github.com/NWebsec/NWebsec/wiki
Nordés酒店

6

尼克·埃文斯的答案很完美,但是...

如果出于安全考虑删除这些标头,请不要忘记更改ASP.NET Session coockie name!因为在看到此消息时,更容易猜测所使用的语言或服务器版本:

在此处输入图片说明

更改Cookie名称:(有创意)

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

更改cookie名称不仅具有服务器技术所带来的更多好处-例如,降低了进行通用批量会话收集的风险
mlhDev

4

从@ 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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.