[英]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.