[英]HttpWebRequest check for allowed domain
我有一個關於允許用戶僅連接允許的域名的問題。
所以我想到的是:我有一個域名列表,例如* .domain1.com; * .domain2.com等...
然后在代碼中的某個地方,我必須檢查請求或響應是否確實來自該類型的域,如果不是,則應該拋出一條消息。
這是我現在擁有的代碼:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url");
using (WebResponse response = request.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
if (stream == null)
{
return null;
}
return stream;
}
}
任何想法?
使用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;
}
}
您可能想要修改比較:例如,向后遍歷request.ResponseUri.Host.Split(".")
結果,依次比較每個部分與allowedDomains值中的等效部分,您可能想考慮檢查完成:是否要允許重定向? 如果是這樣,請從用戶輸入中創建一個Uri對象,然后檢查該對象的Host
屬性。
通常,它是使用UrlReferer HTTP標頭獲取的,但是此標頭不是必需的:可以設置還是不設置。 它取決於HTTP服務器。
可以使用HttpWebResponse.Headers
屬性訪問整個標頭:
((HttpWebResponse)response).Headers["Referer"]
老實說,我想向您建議最好的解決方案是使用應用程序密鑰 (任意標識符)。 例如Guid
(它可能適用於非常簡單的情況)。
在Web服務器中,您可以定義默認標頭(如果您的網站是使用ASP.NET開發的,則可以在web.config中進行設置 ),這樣來自整個服務器的任何請求都將包含帶有appkey的任意HTTP標頭。
也就是說,您可以定義一個任意標頭,以標識來自您的網站的HTTP響應。 例如: MySite_AppKey 。 使用這種方法,你應該確認任何HTTP響應包含整個MySite_AppKey並檢查整個的AppKey在一些白名單允許的。
樣本偽代碼:
if(AppAuthorizationManager.IsAuthorized(response.Headers["MySite_AppKey]))
{
// Do stuff for the authorized request
}
請注意,我描述的是一個非常簡單的實現 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.