[英]How do I securely get the domain name of the running ASP.NET site
我在HTTP事务中遇到了欺骗Host值的一些问题。 为了关闭与这些类型的攻击相关的安全漏洞,我需要安全地检测正在运行的ASP.NET站点的域。 不幸的是, 我发现的所有引用都建议您使用Request.ServerVariables["HTTP_HOST"]
或Request.Url.Host
。 通过提交无效的HTTP数据包,我能够设置无效的主机值,并观察它们在两个函数调用中引起的行为。 我看到的行为是不同的取决于我使用的.NET环境的类型。
在IIS 6中,无论我是直接在MVC Controller操作中访问请求,还是在需要我通过HttpContext.Current.Request
访问值的位置,注入的值总是显示出来。
在Visual Studio 2012 ASP.Net开发服务器中,我只看到我们通过NuGet包部署到项目的库代码中的注入值。 在NuGet包中,我必须使用HttpContext.Current
因为代码在Web应用程序范围之外运行。 当我保持在Web应用程序命名空间的范围内时,即使我必须调用HttpContext.Current
,它也会提供正确的非默认值。
对于所有这些测试,我一直在使用ASP.NET 4.0。 ASP.NET 4.5和IIS 8中是否更改了此行为? 有没有办法安全地获取域名? 也可以对PHP进行相同的攻击 ,但Apache有一种方法可以防止这些类型的攻击 。 IIS?
我遇到问题的代码示例:
string siteName1 = HttpContext.Current.Request.ServerVariables["HTTP_HOST"];
string siteName2 = HttpContext.Current.Request.Url.Host;
无效HTTP数据包的示例:
GET: https://sampledomain.com/Items/Index
Host: fakedomain
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: max-age=0
我已经使用Firefox扩展Live HTTP标头进行了测试,这使我能够快速记录并重放我对Web服务器的请求。
在IIS中,您可以设置站点的绑定,以便它只获取与特定主机头值匹配的请求。
这样,如果有人试图欺骗主机标头值,您的网站甚至不会看到请求。
不完全是您的问题的答案,但可能是您的问题的解决方案。
目前还不清楚“安全”是什么意思,但主机标题的整个要点是允许浏览器指定它打算与之交谈的主机。
RFC 2616对Request-URI
和Host
头有几点要说:
为了允许在将来的HTTP版本中的所有请求中转换为
absoluteURI
,所有HTTP / 1.1服务器必须接受请求中的absoluteURI
表单,即使HTTP / 1.1客户端只会在对代理的请求中生成它们。...
Request-URI
的最常见形式是用于标识源服务器或网关上的资源。 在这种情况下,URI的绝对路径必须作为Request-URI
传输(参见第3.2.1节,abs_path
),并且URI(权限)的网络位置必须在Host
头字段中传输。...
- 如果
Request-URI
是absoluteURI
,则主机是Request-URI
。 必须忽略请求中的任何Host
头字段值。...
Host
字段值必须表示原始URL给出的源服务器或网关的命名权限。 这允许源服务器或网关区分内部不明确的URL,例如单个IP地址上的多个主机名的服务器的根“/”URL。...
客户端必须在所有HTTP / 1.1请求消息中包含
Host
头字段。 如果请求的URI不包含所请求服务的Internet主机名,则必须为Host
头字段指定一个空值。...
客户端和服务器支持
Host
请求标头的要求,如果HTTP / 1.1请求中缺少Host
请求标头(第14.23节),并且接受绝对URI(第5.1.2节),则报告错误是最重要的本规范定义的更改。...
- 客户端和服务器都必须支持
Host
请求标头。- 发送HTTP / 1.1请求的客户端必须发送
Host
头。- 如果HTTP / 1.1请求不包含
Host
请求标头,服务器必须报告400(错误请求)错误。- 服务器必须接受绝对URI。
总之,符合HTTP的客户端无法发送请求
GET https://example.com/ HTTP/1.1
Host: fakedomain.invalid
到原始服务器,一个HTTP / 1.1服务器被要求接受它,使用example.com
作为主机,和“忽略”的Host
首部。 Request.Url.Host
绝对应该是example.com
; 如果不是,它是IIS中的一个错误。 我不太确定Request.ServerVariables["HTTP_HOST"]
,但是对“忽略”主机头的合理解释是将其重写为example.com
。
(顺便提一下,我刚刚测试过的另外两个服务器也没有遵循规范:Apache 2.4.3假设对absoluteURI
的请求必须是一个代理并且在此基础上拒绝它,而lighttpd 1.4.28允许GET http://example.com/ HTTP/1.1
没有Host
标头的情况下GET http://example.com/ HTTP/1.1
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.