HttpWebRequest检查允许的域

时间:2013-03-08 08:12:19

标签: c# httpwebrequest

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

所以我想到的是:我有一个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;
            }
        }

有什么想法吗?

2 个答案:

答案 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
}

请注意,我正在描述一个非常简单的实现