2013-03-08 49 views
0

我有一個問題,關於允許用戶connecto只允許的域名。HttpWebRequest檢查允許的域名

所以我想到的是:我有一個domaina名稱的列表,如* .domain1.com; * .domain2.com等...

然後somwhere在代碼中我必須檢查請求或響應是否真的來自該類域,如果不是,我應該拋出一條消息。

在這裏,我有我已經在這一刻代碼:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url"); 
     using (WebResponse response = request.GetResponse()) 
     { 
      using (Stream stream = response.GetResponseStream()) 
      { 
       if (stream == null) 
       { 
        return null; 
       } 
       return stream; 
      } 
     } 

任何想法?

回答

1

使用ResponseUri屬性:

HashSet<String> allowedDomains = new HashSet<String>() 
           { 
             "domain1.com", 
             "domain2.com" 
           }; 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url"); 
using (WebResponse response = request.GetResponse()) 
{ 
    if (!allowedDomains.Contains(response.ResponseUri.Host)) 
    { 
     throw new IllegalDomainException(); 
    } 
    using (Stream stream = response.GetResponseStream()) 
    { 
     if (stream == null) 
     { 
      return null; 
     } 
     return stream; 
    } 
} 

您可能需要修改comparisson:例如,向後遍歷的request.ResponseUri.Host.Split(".")比較依次從allowedDomains值相當於每個部分的結果,您可能希望考慮檢查完成的地方:你想要重定向嗎?如果是這樣,請從用戶輸入創建一個Uri對象,然後檢查該屬性的Host

+0

感謝男人它真的很酷,但你知道也許怎麼可能做一個正則表達式替換例如我得到了hsot它會像sub.domain.com和我需要=> *。domain.com可以你幫我用regex.replace,說取代*之前的第一個字母點? – Alnedru 2013-03-08 09:00:33

+0

'System.Linq',有一個擴展方法'HashSet.Contains'可以採用'IEqualityComparer'。實現一個類,在'Equals'方法中使用所需的regex代碼。 – RoadieRich 2013-03-08 09:03:53

+0

另外,爲'HashSet '更改'HashSet ',並使用'allowedDomains.Any(re => re.Match(request.Host).Success)'而不是'allowedDomains.Contains(...) ' – RoadieRich 2013-03-08 09:10:00

0

通常這是通過使用UrlReferer HTTP標頭獲取的,但是這個標頭不是必需的:它可以設置或不設置。它取決於HTTP服務器。

整個頭可以使用HttpWebResponse.Headers屬性來訪問:

((HttpWebResponse)response).Headers["Referer"] 

老實說,我想建議你,最好的解決方法是使用一個應用程序鍵(任意標識符)。例如一個Guid(它可能適用於非常簡單的情況)。

在Web服務器,您可以定義默認標頭(如果你的網站正在使用ASP.NET,you can do it in the web.config開發),所以從整個服務器的所有請求將包含與的AppKey您任意HTTP標頭。

也就是說,您可以定義一個任意的標頭,可以標識來自您的網站的HTTP響應。例如:MySite_AppKey。使用這種方法,您應該驗證任何HTTP響應是否包含整個MySite_AppKey並檢查整個設備密鑰是否允許在某個白名單中。

示例僞代碼:

if(AppAuthorizationManager.IsAuthorized(response.Headers["MySite_AppKey])) 
{ 
    // Do stuff for the authorized request 
} 

請注意,我描述一個非常簡單的實現