阻止一个起源于 "https:/ec2b.foo.com "的框架访问一个跨起源的框架。

问题描述 投票:0回答:1

以下是我的代码

tl2010handle = window.open("/path/main.html", 'tl2010', 'statusbar=no,toolbar=no,scrollbars=no,locationbar=no,setResizable=no,width=840,height=600');
setTimeout(function() {console.log(tl2010handle.window.location.href)}, 2000); 

如果我将我的页面加载为 https://ec2b.foo.com/console/login2020.jsp 我得到 DOMException: Blocked a frame with origin "https://ec2b.foo.com" from accessing a cross-origin frame.

如果我添加一个条目 143.67.75.100 ec2b 到etchosts,然后将我的页面加载为 https://ec2b/console/login2020.jsp 它工作了,我的控制台记录了href。

谜团是我用一个没有指定来源的URL打开窗口,所以我不明白为什么Chrome会抱怨我的请求是跨来源的。

代码只存在于一台服务器上,所以不存在ec2b和ec2b.foo.com不同的可能性。我在Chrome和Firefox中都试过,结果一样,不过在Firefox中,tl2010handle变量在第一种情况下是未设置的,而在第二种情况下是设置的。

javascript google-chrome browser browser-security
1个回答
0
投票

谜底是,我用一个没有指定来源的URL打开了窗口

你有一个错误的认识。原点请求头. 原点是由浏览器发送的,在 这种情况... 在JavaScripts的情况下,起源是 遗传性 在该页 执行脚本. 你得到的错误信息表明,你的原点被设置为。“https:/ec2b.foo.com

该代码只存在于一台服务器上,所以不存在ec2b和ec2b.foo.com不同的可能性。

注意,同源并不意味着同ip。它的意思是 协议:主机:端口 元组应该是完全一样的,这意味着 foo.com, ec2b.foo.comwww.foo.com 都是不同的起源(尽管它们都指向同一个IP)。


错误信息表明,你的JavaScript的起源被设置为:"https:/ec2b.foo.com。"......现在在你的JavaScript文件中,你打开一个新的浏览器窗口,运行以下内容。

window.open("/path/main.html", ....); // <-- open a new browser window

你还没有提到你在这个新窗口中看到的URL是什么(我怀疑是 "https:/ec2bpathmain.html。")......但它肯定不是"https:/ec2b.foo.com",这就是为什么当你试图访问的时候。location.href 的新窗口,你会被阻止,因为这是一个跨源请求。

根据 MDN: Window.Open() 返回一个Window对象,代表新创建的窗口。

返回的引用可用于访问新窗口的属性和方法,只要它符合下列条件: 同源 政策安全要求。

你也可以尝试运行以下脚本来找出你的JavaScript文件的来源。

tl2010handle = window.open("/path/main.html", 'tl2010', 'statusbar=no,toolbar=no,scrollbars=no,locationbar=no,setResizable=no,width=840,height=600');
console.log(tl2010handle.origin); // <-- origin of your script file
/*
 * if you compare: tl2010handle.origin with the url display in tl2010handle window
 * it should clarify why you are having a cross-origin request.
 */
© www.soinside.com 2019 - 2024. All rights reserved.