HTTP 标头 Access-Control-Allow-Origin 中是不是有最大数量的允许来源?

Posted

技术标签:

【中文标题】HTTP 标头 Access-Control-Allow-Origin 中是不是有最大数量的允许来源?【英文标题】:Is there a maximum number of allowed origins within HTTP header Access-Control-Allow-Origin?HTTP 标头 Access-Control-Allow-Origin 中是否有最大数量的允许来源? 【发布时间】:2013-11-26 04:54:05 【问题描述】:

我有大约 130 个白标签网站,它们都位于不同的域中,但每个网站上的表单都需要发布到一个共同的端点。我正在尝试通过使用跨域请求共享来实现这一点。

考虑到安全性,我不想使用..

Access-Control-Allow-Origin: *

因此我试图创建一个逗号分隔的域列表以允许,即..

Access-Control-Allow-Origin: http://www.myfirstdomain.com,http://www.myseconddomain.com....

为了在后端实现这一点,我设置了一个 ASP.Net Web API 解决方案,并试图通过使用 System.Web.Http.Cors 库和在“应用程序启动”上定义这些域。

我的“应用程序启动”代码如下所示..

public static void Register(HttpConfiguration config)
    
        var domains = "http://www.myfirstdomain.com,http://www.myseconddomain.co.uk .... about 130 domains more..";
        config.EnableCors(new EnableCorsAttribute(domains, "*", "*"));

我正在测试的域是逗号分隔列表中的大约 110 个域,当我尝试 jQuery ajax 帖子时,它首先按预期调用 OPTIONS 方法(以确定请求是否允许)但这会返回错误 Origin http://www.mytestdomain.com is not allowed by Access-Control-Allow-Origin.

但是,如果我将逗号分隔的字符串修改为只有我的域,甚至两个或三个域,OPTIONS 将返回 200 响应并因此允许 POST。

有谁知道这是预期的行为还是可以看出我哪里出错了?

【问题讨论】:

我不知道这种行为,但您可以检查请求的域,如果匹配,则仅为该域发送一个标头 我的第一个猜测是允许域列表中缺少逗号或任何其他小错误(您绝对应该从配置文件/数据库/xml文件/....在源代码中:-) 逗号分隔的字符串是由数据库和字符串构建的。加入,我只是贴出硬编码的字符串以方便阅读 正如@Bartdude 所说,这可能是允许的域之一中的错误(即使是尾随 / 也可能导致问题)。有关验证规则,请参见例如:github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/… 知道了,其中一个域中有一个尾随空格!去展示如果它设法滑入数据库,这会如何搞砸每个网站,很高兴我提前找到了这个,谢谢.. 【参考方案1】:

解决方案是我的数据库中有一个带有尾随空格的恶意域。因此,这在传递给 EnableCorsAttribute 时会导致问题,因此请小心您的数据!

【讨论】:

您真的不应该在响应标头中返回所有授权域。

以上是关于HTTP 标头 Access-Control-Allow-Origin 中是不是有最大数量的允许来源?的主要内容,如果未能解决你的问题,请参考以下文章

Http-Server 如何创建请求标头和响应标头

HTTP 标头或 SOAP 标头中的 WCF 肥皂操作?

HTTP 连接标头

HTTP 1.1 TE 标头

Apache Jmeter HTTP 标头管理器覆盖“主机”标头而不附加端口

如何调试来自 HTTP 调用的 http 响应标头