阻止具有源的框架访问跨域框架 使用相同的域

Posted

技术标签:

【中文标题】阻止具有源的框架访问跨域框架 使用相同的域【英文标题】:blocked a frame with origin from accessing a cross-origin frame Using the same domain 【发布时间】:2015-04-05 13:56:42 【问题描述】:

您好,我对此消息有疑问。

我的主页面的网址是:

page1.mydomain.com/page1.html

此页面有一个 iframe:

frame.mydomain.com/iframe.html

然后我从主页打开另一个页面的窗口,如下所示:

mywindow = window.open("http://page1.mydomain.com/page3.html", 'page3', 'status=1,height=768,width=1280,scrollbars=1');

所有3个页面都设置了javascript

document.domain = "mydomain.com";

我可以毫无问题地从主页交互到 iframe。 我只有访问 window.open 属性的问题。

喜欢:

mywindow.document.getElementById("something")

我收到了那个错误信息。

blocked a frame with origin from accessing a cross-origin frame

如果我从第 3 页尝试:

window.opener.document.getElementById("somethingPage1")

我遇到了同样的错误:

blocked a frame with origin from accessing a cross-origin frame

为什么我可以和 iframe 交互,而不能和 window.open 和 window.opener 交互?

【问题讨论】:

我不能 100% 确定,但这可能是因为您的 iframe/frames 不是从相同的域、主机、端口加载的。以下是一些可能对您有所帮助的资源:@​​987654321@developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORSdeveloper.mozilla.org/en-US/docs/Web/HTML/… 如果您有更多详细信息,请告诉我。 嗨。我没有 iframe 的问题。问题在于弹出窗口。两者都来自同一个域/端口。实际上,该文件位于同一目录中。由于我没有找到任何解决方案,我正在使用 postMessage... 目录无关紧要,但据我所知,即使您设置了 document.domain,您也无法与主域的子域提供的页面进行交互。具有相同目录(路径)的部分无关紧要,因此您可以拥有任何您想要的嵌套。在 jsbin 或 jsfiddle 或 github 上分享一些代码,我们会弄清楚的。 它不像 page1 和 page3 设置了相同的 document.domain。确保在您进行访问时已设置该属性。这比听起来要难,因为文档都可能需要一段时间来加载和运行设置document.domain 的脚本。例如,如果您window.open 然后立即访问mywindow.document.something,则几乎不可能访问它。跨窗口脚本很繁琐,window.postMessage 在很多情况下更容易。 【参考方案1】:

在我的情况下,域名不同,我通过用父域名替换客户的域来解决它。如果在子(弹出)窗口中域名无关紧要,您可以尝试。 您尝试访问 window.opener.document.getElementById() 的内容将不起作用。 它会在您发布时引发安全错误。最好的方法是尽可能将两个 URL 设置在同一个域名下。或者只是为了开发你可以安装扩展 "Allow-Control-Allow-Origin:" 在 Chrome 中它会起作用。

【讨论】:

以上是关于阻止具有源的框架访问跨域框架 使用相同的域的主要内容,如果未能解决你的问题,请参考以下文章

阻止具有来源的框架访问 wordpress 中的跨域框架

阻止原始框架“null”访问跨域框架 - chrome

GWT 阻止源为“http://localhost”的框架访问跨域框架

跨域请求的常用方式及解释

关于cors

js跨域访问问题