如何从 iframe 获取当前页面加载的 url [重复]

Posted

技术标签:

【中文标题】如何从 iframe 获取当前页面加载的 url [重复]【英文标题】:How to get current page loaded url from iframe [duplicate] 【发布时间】:2014-11-21 04:54:43 【问题描述】:

当我使用 faroo 搜索并移动到其他网页时,我正在使用 iframe 将 faroo.com 作为默认 src 加载到框架中。但仍然在 iframe src 中显示 faroo.com,我只想捕获具有在 iframe 中加载

<!DOCTYPE html>
<html>
<head>
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.1.min.js"></script>
    <script type="text/javascript">
    $(function()
        $('#frameid').load(function()
            var z=$('#frameid').attr('src');
            console.log('hi '+z);
        );

        $('#clicked').on('click', function()
            $('#frameid').attr('src', 'http://www.faroo.com/');    
        );
    );

</script>

</head>
<body>

<iframe   id="frameid" src="" name="iframe_a" ></iframe>

<p><input type="button" value="click me!" id="clicked"></p>

</body>
</html>

console.log 的 o/p 始终是 faroo.com,而不是当前加载的网站

【问题讨论】:

如果您正在寻找 iframe 的“父”页面的 url,请参阅***.com/q/3420004/32453 【参考方案1】:

为了安全起见,只要 iframe 的内容和引用的 javascript 托管在同一个域中,您就可以检索 URL。

如果是这样,你可以这样做:

document.getElementById("frameid").contentWindow.location.href

如果这两个域不同,那么您将拥有适用于 cross-site reference scripting 域的所有限制。示例:

document.getElementById("frameid").src = 'http://www.google.com/';
alert(document.getElementById("frameid").documentWindow.location.href);

Error: Permission denied to get property Location.href

当然(除非您在浏览器中发现一些巨大的安全漏洞)您只是无法实现在父文档中使用javascript 所需的功能。让我们看一个简单的例子为什么。如果浏览器允许您的需要,您可以轻松:

    创建一个带有隐藏 iframe 的页面(例如 http://malicous.com/dont-trust) 在该 iframe 中,打开一个子页面,其中包含某些网站的登录过程(例如 http://insecure-web-site.com/redirectlogin) 如果存在针对儿童的 cookie,并且在某些情况下,框架内的页面将重定向到真实网站,并继续进行用户登录。 现在,您将能够从父页面读取 URL 中包含的登录过程中包含的所有敏感信息,例如访问令牌、会话 ID、... 此时,受害网站及其用户面临一系列新的可能的安全威胁...

【讨论】:

也许 document.getElementById('myframe').contentWindow.document.location.href 会起作用 还有其他方法吗?我正在尝试创建一个虚拟浏览器,它可以记录它访问过的页面的 URL 作为历史记录。 我不认为你可以用 JS 做到这一点。查看更新的答案。 提供的示例没有任何意义。如果用户在他的浏览器中看到 URL “malicious.com”并且他继续输入他的登录信息,对 iframe 的安全限制不会保护他。 @Dodekeract 是对的,但人们不检查网址。更大的问题是,如果您单击指向 malicous.com 的链接,然后它通过重定向加载 insecure-web-site.com/user/youruserID,则 malicous.com 会知道您的用户 ID 或安全令牌,或者它不应该知道的东西。 【参考方案2】:

似乎有一个 hack 可以使这项工作有效,我什至不敢相信它甚至被允许。它似乎是这样工作的:

1) 更改域以匹配 iframe:

document.domain = <iframe_domain>

2) 像这样获取 URL:

console.log($('iframe')[0].contentWindow.location.href)

在我看来,这不应该有效,但确实有效。截至 2017 年 2 月 1 日,我在 Safari、Chrome 和 Firefox 中使用以下所有最新版本进行了测试:

主要:http://subdomain.website.com iframe:http://www.website.com

你怎么看?这是永久允许的,还是将很快修补的疏忽?

更新

我在这里发起了另一个线程来讨论浏览器安全性。

Isn't This A Serious Browser Security Issue? RE: Cross-Domain iframe Hack

更新 2

似乎在特定情况下始终支持此功能。

https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy

【讨论】:

以上是关于如何从 iframe 获取当前页面加载的 url [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Js获取Iframe页面高度,并将高度赋值给Iframe

纯前端如何实现跳转页面而不改变URL(不使用iframe)?

怎样在父页面里获取加载(iframe)另一个网页的高度(父页面获取iframe里面加载页面的高度)

iframe跨域获取父页面url

如何在子页面得到其所在的iframe

.net中如何获取被请求页面的 url