我有一个关于允许用户只允许连接域名的问题。
所以我想到的是:我有一个domaina名单,如* .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;
}
}
有什么想法吗?
答案 0 :(得分: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;
}
}
您可能需要修改比较:例如,向后迭代request.ResponseUri.Host.Split(".")
的结果依次比较每个部分与allowedDomains值的等价物,您可能想要考虑检查的完成位置:你想要允许重定向吗?如果是这样,请从用户输入创建一个Uri对象,并检查该属性的Host
属性。
答案 1 :(得分: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 ,并检查某些白名单中是否允许整个 appkey 。
示例伪代码:
if(AppAuthorizationManager.IsAuthorized(response.Headers["MySite_AppKey]))
{
// Do stuff for the authorized request
}
请注意,我正在描述一个非常简单的实现。