繁体   English   中英

HttpWebRequest检查允许的域

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM