C# 允许域的HttpWebRequest检查

C# 允许域的HttpWebRequest检查,c#,httpwebrequest,C#,Httpwebrequest,我有一个关于允许用户只连接允许的域名的问题 所以我想到的是:我有一个域名列表,比如*.domain1.com;*。域名2.com等 然后,在代码中,我必须检查请求或响应是否真的来自此类域,如果不是,我应该抛出一条消息 这是我目前掌握的代码: HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url"); using (WebResponse response = request.GetRespo

我有一个关于允许用户只连接允许的域名的问题

所以我想到的是:我有一个域名列表,比如*.domain1.com;*。域名2.com等

然后,在代码中,我必须检查请求或响应是否真的来自此类域,如果不是,我应该抛出一条消息

这是我目前掌握的代码:

        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(…)