在没有UrlScan的情况下删除/隐藏/禁用Azure / IIS7中过多的HTTP响应标头
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在没有UrlScan的情况下删除/隐藏/禁用Azure / IIS7中过多的HTTP响应标头相关的知识,希望对你有一定的参考价值。
我需要删除excessive headers(主要是为了通过渗透测试)。我花了很多时间研究涉及运行UrlScan的解决方案,但这些都像UrlScan needs to be installed each time an Azure instance is started一样繁琐。
必须有一个很好的Azure解决方案,不涉及从startup.cmd部署安装程序。
我知道响应标头是在different places中添加的:
- 服务器:由IIS添加。
- X-AspNet-Version:在Flush in HttpResponse类中由System.Web.dll添加
- X-AspNetMvc-Version:由System.Web.dll中的MvcHandler添加。
- X-Powered-By:由IIS添加
是否有任何方法配置(通过web.config等?)IIS7删除/隐藏/禁用HTTP响应标头,以避免在asafaweb.com上出现“过多标题”警告,而无需创建IIS模块或部署需要运行的安装程序每次Azure实例启动?
以下更改允许您在Azure中删除这些HTTP响应标头,而无需编写自定义HttpModule。
网上的大部分信息都已过时,并涉及UrlScan(此后已集成到IIS7中,但删除了RemoveServerHeader=1
选项)。下面是我发现的最好的解决方案(感谢this blog,this answer和this blog的组合)。
要删除Server,请转到Global.asax,找到/创建Application_PreSendRequestHeaders
事件并添加以下内容(感谢BK和this blog,这也不会在Cassini / local dev上失败):
2014年4月编辑:您可以将PreSendRequestHeaders和PreSendRequestContext事件与本机IIS模块一起使用,但不要将它们与实现IHttpModule的托管模块一起使用。设置这些属性可能会导致asynchronous requests出现问题。正确的版本是使用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>
...
MSDN发布了this article,了解如何隐藏Azure网站上的标题。您现在可以通过向system.webServer添加条目来从web.config隐藏服务器
<security>
<requestFiltering removeServerHeader ="true" />
</security>
虽然VS会对上面的内容感到无效。上面的链接有代码作为图片,很难找到。如上所述,MVC版本仍然隐藏在应用程序启动中,对于x-powered-by和.Net版本也是如此。
NuGet上还有一个软件包可以帮助您通过几行配置实现这一点,而无需更改代码:NWebsec。有关删除版本标题的文档可以在这里找到:https://github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers
它在这里演示:http://www.nwebsec.com/HttpHeaders/VersionHeaders(在Azure中)
免责声明:我是该项目的开发人员。
Nick Evans的回答很完美,但......
如果出于安全目的删除这些标题,请不要忘记更改ASP.NET Session coockie name
!因为当您看到它时,更容易猜测使用的语言或服务器版本:
要更改Cookie名称:(要有创意)
<system.web>
<sessionState cookieName="phpSESSID" />
</system.web>
汇总了来自@ 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>
以上是关于在没有UrlScan的情况下删除/隐藏/禁用Azure / IIS7中过多的HTTP响应标头的主要内容,如果未能解决你的问题,请参考以下文章
如何在不隐藏正文滚动条的情况下在固定 div 上滚动时禁用正文滚动?