浏览器不在 Origin 标头中发送 FQDN
Posted
技术标签:
【中文标题】浏览器不在 Origin 标头中发送 FQDN【英文标题】:Browser doesn't send FQDN in Origin header 【发布时间】:2016-02-04 09:11:37 【问题描述】:在 CORS 的上下文中,是否可以强制浏览器始终发送带有 FQDN 的 Origin 标头?目标服务应该看到 Origin: http://website.intranet.example.com/page.html
而不是 Origin: http://website/page.html
。
正如示例所暗示的,这是一个 Intranet 环境,目标是按子域过滤请求来源,以允许托管在域计算机 (*.intranet.example.com
) 上的任何页面向同样托管在同一个域。问题(如果您愿意的话)是 Intranet 站点通常被寻址为 http://website/
,其余部分由连接特定的 DNS 后缀暗示:intranet.example.com
通过域策略设置。
我能想到的唯一解决方法是要求所有“原始”页面强制使用规范 URL(即将 //foo
重定向到 //foo.intranet.example.com
),同时“丑陋 URL”的副作用最小。
【问题讨论】:
【参考方案1】:在 CORS 上下文中,与其尝试为短域名和完全限定域名获取相同的 Origin 值,您可以只关注服务器是否应允许请求继续进行,无论是否存在任何 Origin 值:
假设为了允许跨域请求,响应服务器只需要响应一个合适的 Access-Control-Allow-Origin 响应头,你可以用通配符值响应说任何传入的 Origin 都可以:
Access-Control-Allow-Origin: *
如果您的客户端需要一个特定的域而不是通配符,您可以让网络服务器在您选择允许请求继续的情况下回显传入的 Origin 标头的值,而不管 Origin 值表示的是什么。
例如在 Apache 中,使用 SetEnvIf 和 Header 模块编写包含原始值的环境变量,如果该值与特定的正则表达式匹配,则如果该变量存在,则使用环境变量的值写入 Access-Control-Allow-Origin 响应标头:
SetEnvIf Origin "(.+)" origin_header_value=$1
Header set Access-Control-Allow-Origin "%origin_header_valuee" env=origin_header_value
如果您需要更精细地控制网络服务器是否以这种方式包含 Access-Control-Allow-Origin 标头,您可以在 SetEnvIf 命令中设置更严格的正则表达式,而不是使用.+
。
【讨论】:
问题是Origin: http://server1/
是模棱两可的。请求可能是来自server1.intranet.example.com
或server1
页面的合法请求,可能是某个局域网上的恶意机器;这适用于域用户位于远程并使用 *** 或 DirectAccess 访问 Intranet 的情况。
这可能适用于任何 http 请求,尽管听起来您希望根据 Origin 标头值确定请求的合法性,但这不是确定恶意请求的好方法 - 您可以http 请求中设置了任何值。也许您可以根据白名单添加对传入 IP 地址的额外检查?或者添加一些http授权或者假设如果你可以确定请求是通过***到达的,那么它应该已经被允许了? - 这可能取决于它是封闭的还是开放的 Intranet。
用户导航到http://evil-comp/page.html
(非域服务器),它对http://payroll.intranet.example.com/confidential
进行AJAX调用,然后将该数据转发到其他地方。适当的 CORS 策略将阻止 http://evil-comp/page.html
看到响应的内容。
但是是的,你是对的,可以发出 http 请求来窃取相同的数据,但这需要攻击者在用户凭据下在域机器上执行代码 - 但这是另一回事与 CORS 无关的攻击向量。
只是为了进一步了解这一点 - 这是您连接到 *** 的情况,但没有为地址解析添加公司 DNS 服务器?我想知道您是否可以仅在请求来自特定的已知 Origin 值(设置为 short 或 fqdn)时才允许查看 payroll
服务器上的资源,并强制 *** 的 DNS 在域名解析中优先并将短名称和 fqdn 名称解析到正确的位置?以上是关于浏览器不在 Origin 标头中发送 FQDN的主要内容,如果未能解决你的问题,请参考以下文章
Django 向浏览器发送响应它收到此错误:请求的资源上不存在“Access-Control-Allow-Origin”标头
缓存跨域资产时,Chrome 应用程序缓存不发送“Origin”标头
CORS“Access-Control-Allow-Origin”值如何暴露给浏览器?
服务器返回 CORS 标头,浏览器仍然抛出 Cross-Origin Request Blocked 错误