C# 允许域的HttpWebRequest检查
我有一个关于允许用户只连接允许的域名的问题 所以我想到的是:我有一个域名列表,比如*.domain1.com;*。域名2.com等 然后,在代码中,我必须检查请求或响应是否真的来自此类域,如果不是,我应该抛出一条消息 这是我目前掌握的代码:C# 允许域的HttpWebRequest检查,c#,httpwebrequest,C#,Httpwebrequest,我有一个关于允许用户只连接允许的域名的问题 所以我想到的是:我有一个域名列表,比如*.domain1.com;*。域名2.com等 然后,在代码中,我必须检查请求或响应是否真的来自此类域,如果不是,我应该抛出一条消息 这是我目前掌握的代码: HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url"); using (WebResponse response = request.GetRespo
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url");
using (WebResponse response = request.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
if (stream == null)
{
return null;
}
return stream;
}
}
有什么想法吗?通常这是使用UrlReferer HTTP头获取的,但此头不是必需的:可以设置也可以不设置。它取决于HTTP服务器 可以使用以下属性访问整个标头:
((HttpWebResponse)response).Headers["Referer"]
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;
}
}
老实说,我想建议您,最好的解决方案是使用应用程序密钥(任意标识符)。例如Guid
(它可能适用于非常简单的情况)
在Web服务器中,您可以定义默认标头(如果您的网站是使用ASP.NET开发的),因此来自整个服务器的任何请求都将包含带有appkey的任意HTTP标头
也就是说,您可以定义一个任意头,该头可以标识来自您的网站的HTTP响应。例如:MySite\u AppKey。使用这种方法,您应该验证任何HTTP响应是否包含整个MySite\u AppKey,并检查整个AppKey是否允许出现在某个白名单中
示例伪代码:
if(AppAuthorizationManager.IsAuthorized(response.Headers["MySite_AppKey]))
{
// Do stuff for the authorized request
}
请注意,我正在描述一个非常简单的实现。使用
ResponseUri
属性:
((HttpWebResponse)response).Headers["Referer"]
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;
}
}
HashSet allowedomains=new HashSet()
{
“域名1.com”,
“域名2.com”
};
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(“url”);
使用(WebResponse=request.GetResponse())
{
if(!allowedDomains.Contains(response.ResponseUri.Host))
{
抛出新的非法域异常();
}
使用(Stream=response.GetResponseStream())
{
if(流==null)
{
返回null;
}
回流;
}
}
您可能需要修改比较:例如,向后迭代
request.ResponseUri.Host.Split(“.”
的结果,依次将每个部分与allowedDomains值中的等效部分进行比较,您可能需要考虑检查的位置:是否允许重定向?如果是这样的话,从用户输入创建一个Uri对象,并检查该对象的Host
属性。谢谢,伙计,这真的很酷,但是你知道怎么做regex替换吗?例如,我得到了hsot,它将类似sub.domain.com,我需要=>*。domain.com你能帮我做regex.replace吗,用*?系统替换点前面的第一个字母。Linq
具有扩展方法哈希集。Contains
可以采用IEqualityComparer
。使用Equals
方法中所需的正则表达式代码实现一个公开该类的类。或者,更改HashSet
的HashSet
,并使用allowedDomains.Any(re=>re.Match(request.Host.Success)
而不是allowedDomains.Contains(…)