0

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

所以我想到的是:我有一个域名列表,比如 *.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;
            }
        }

任何想法?

4

2 回答 2

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属性。

于 2013-03-08T08:45:05.487 回答
0

通常这是使用UrlReferer HTTP 标头获取的,但此标头不是强制性的:可以设置或不设置。这取决于 HTTP 服务器。

可以使用以下HttpWebResponse.Headers属性访问整个标头:

((HttpWebResponse)response).Headers["Referer"]

老实说,我想建议您最好的解决方案是使用应用程序密钥(任意标识符)。例如 a 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
}

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

于 2013-03-08T08:43:02.790 回答