从 iframe 访问父网址

2022-08-30 00:45:51

好的,我有一个页面,在这个页面上我有一个iframe。我需要做的是在iframe页面上,找出主页的URL是什么。

我已经搜索了一下,我知道如果我的iframe页面位于不同的域上,这是不可能的,因为这是跨站点脚本。但是我读过的所有地方都说,如果iframe页面与父页面位于同一域中,那么如果我这样做,它应该有效:

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

...或其他类似的组合,因为似乎有多种方法可以获得相同的信息。

无论如何,这就是问题所在。我的 iframe 与主页位于同一域中,但不在同一子域中。例如,我有

http:// www.mysite.com/pageA.html

然后我的 iframe 网址是

http:// qa-www.mysite.com/pageB.html

当我尝试从(iframe页面)获取URL时,我不断收到相同的访问被拒绝错误。因此,似乎即使是子域也算作跨站点脚本,这是正确的,还是我做错了什么?pageB.html


答案 1

是的,如果 iframe 和主页不在同一(子)域中,则不允许访问父页面的 URL。但是,如果您只需要主页的URL(即浏览器URL),则可以尝试以下操作:

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

注意:

window.parent.location是允许的;它避免了OP中的安全错误,该错误是由访问属性引起的:导致“阻止了具有原点的帧...”hrefwindow.parent.location.href

document.referrer 是指“链接到此页面的页面的 URI”。如果确定位置的其他来源(例如:iframe

  • 容器 iframe @ 域 1
  • 将子 iframe 发送到域 2
  • 但是在儿童框架中...域 2 重定向到域 3(即用于身份验证,可能是 SAML),然后域 3 定向域 2(即通过表单提交(),这是一种标准的 SAML 技术)
  • 对于子 iframe,将是域 3,而不是包含域 1document.referrer

document.location 是指 “一个 Location 对象,它包含有关文档 URL 的信息”;大概是当前文档,即当前打开的 iframe。当 时,则 iframe 的 与包含父项的 相同。window.location === window.parent.locationhrefhref


答案 2

我刚刚发现了这个问题的解决方法,它非常简单,但我没有在任何地方找到任何提到它的讨论。它确实需要控制父帧。

在你的 iFrame 中,假设你想要这个 iframe:src=“http://www.example.com/mypage.php”

好吧,不要使用HTML来指定iframe,而是使用javascript为您的iframe构建HTML,在构建时通过javascript获取父URL,并将其作为url GET参数发送到src目标的查询字符串中,如下所示:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

然后,为自己找到一个javascript url解析函数,该函数解析url字符串以获取您所需的url变量,在这种情况下,它是“url”。

我在这里找到了一个很棒的url字符串解析器:http://www.netlobo.com/url_query_string_javascript.html