14

我看了这两个问题,我不明白。

从 iframe 操作重定向父窗口

如何防止 IFRAME 重定向顶级窗口

一方面,您似乎可以重定向父 iframe,而另一方面您不能?当我尝试它时,重定向父框架没有问题,所以我很好奇为什么每个人都说除非你在同一个域上,否则你不能重定向父框架。但是我可以重定向而无需在同一域上使用框架。

如前所述,将重定向父 iframe。要记住的一件事是,网站和 iframe 中包含的网站都需要在同一个域中才能正常工作,否则您将收到拒绝访问异常。

和浏览器有关吗?

编辑

我有两页,这有效,但不应该:

在域 1

<html>
  <body>
    <iframe src="http://domain2.fr"></iframe>
  </body>
</html>

在域 2

<html>
  <body>
    <script type="text/javascript">
      window.top.location.href = "http://google.fr";
    </script>
  </body>
</html>
4

4 回答 4

13

为什么有可能的答案非常简单。window.locationWeb API的一部分,它与 JavaScript 核心并不完全相同。它是DOM 接口的一部分,因此它由 W3C 而非 ECMA 管理。这就是为什么它允许您操纵顶部窗口的属性。

严格来说,JS 做不到这一点,因为它缺乏 IO 能力,这使得该语言具有极强的可移植性。这就是为什么浏览器实现需要 DOM API、查询 DOM、请求重绘或与客户端交互的原因。但是,DOM确实需要 IO,因为它会渲染并从实际 UI 中读取。window.top由于 XSS 漏洞的原因,ECMAScript 委员会中的一些人宁愿看到对受到严格限制的访问,如果没有一起删除的话。遗憾的是,W3C 同意不同意,并且window.top无论如何都实施了该参考。
在这种情况下谁对谁错?我不知道,从 iFrame 中将客户端重定向到恶意站点很容易,这是不安全的。但是如果有一个 iFrame,然后无法访问顶部窗口,这将是令人沮丧的,这意味着无法轻松地与客户端进行交互。但这不是重点。底线是,您可以更改一些顶部窗口属性,这很有用。想想混搭。它们在 XSS 安全方面提出了很多挑战,但为 webaps 开辟了许多新的和令人兴奋的可能性。要堵住一些最危险的 XSS 漏洞,请查看由 Douglas Crockford 创建的 ADSafe。谷歌有一个类似的库,但我忘了它的名字 ATM ......

同源政策也不适用于此处。通过更改浏览器窗口地址栏中的 url,您也在更改window.top.location.href属性。如果那里有同源限制,互联网就会死掉。你没有向另一个位置发送请求,你没有从第三方资源获取数据并将其加载到你的页面中,你正在将浏览器重定向到另一个位置,这会关闭并清除 DOM。

于 2013-08-09T07:55:24.990 回答
6

我的猜测是您可以执行以下操作的原因相同:

<a href="http://google.com" target="_top">Redirect top to Google</a>

我在这里找到了这种行为的规则:http: //www.w3.org/TR/html5/browsers.html#valid-browsing-context-name-or-keyword

我找不到“为什么”,但我个人发现在有人单击 iframe 中的某些内容后重定向父级很有用。您可能希望在重定向整个页面之前先执行异步操作并验证某些内容。因为这已经可以使用<a>标签了,也许它在 JS 中也很合适。不知道为什么<a>标签允许该功能。

话虽如此,您始终可以通过添加sandbox=""属性来防止这种行为,例如:http: //jsfiddle.net/ppkzS/1/

于 2013-08-06T06:42:09.943 回答
5

每当您使用iframesframesobjects时,您都会设置窗口的层次结构,这些项目在此层次结构中充当“窗口”。

.parent您可以使用等属性遍历此层次结构.frameElement。该属性.top是层次结构中最高点的窗口,通常对应于最外层的框架。

在层次结构中的窗口之间禁止某些操作,而其他操作则不是。禁止更改location窗口。

归根结底,说你不能这样做的人是不正确的。如果域不同,您不能做的是从不同窗口访问一个窗口的内容。但是,您可以修改它们的位置属性。

于 2013-08-06T19:44:39.927 回答
0

如果您在同一个域上有两个框架(并且也有相同的协议和端口),那么一个框架可以将另一个框架重定向到您想要的任何地方,并且还可以访问 javascript 属性,从另一个框架执行函数等。

如果您将一个帧从另一个域(或协议或端口)重定向到另一个域(或协议或端口),那么由于Same Origin Policy ,您将失去执行我之前所说的所有操作的能力,但允许重定向本身,因为在重定向之前,这两个框架满足所述策略。

以下是一些有用的信息:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript

从该页面引用:

如果两个页面的协议、端口(如果指定)和主机相同,则两个页面具有相同的来源。

显然,frames是一样的pages

于 2013-08-02T11:58:06.660 回答