我看看这两个问题,我不明白。
Redirect parent window from an iframe action
How to prevent IFRAME from redirecting top-level window
一方面,你可以重定向父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>
答案 0 :(得分:13)
为什么可能的答案非常简单。 window.location
是 Web API 的一部分,它与JavaScript核心不完全相同。它是DOM interface的一部分,因此它被W3C所取代,而不是ECMA。这就是为什么它允许你操纵顶窗的属性。
严格来说,JS无法做到这一点,因为它缺乏IO功能,这使得语言非常便携。这就是浏览器实现需要DOM API,查询DOM,请求重新绘制或与客户端交互的原因。但是,DOM 需要IO,因为它呈现并从实际的UI读取。由于XSS漏洞原因,ECMAScript委员会中的某些人宁愿看到window.top
严重受限的访问权限,如果不是全部一起删除的话。可悲的是,W3C同意不同意,并且无论如何都实施了window.top
参考
在这种情况下谁是对是谁?我不知道,在iFrame中将客户端重定向到恶意网站很容易,这是不安全的。但是拥有一个iFrame,然后无法访问顶部窗口,这将意味着无法轻松地与客户端进行交互,这将是令人沮丧的。但这不是重点。最重要的是,您可以更改一些顶部窗口属性,可以有用。试想 mashup 。它们在XSS安全性方面提出了许多挑战,但为webaps开辟了许多新的令人兴奋的可能性。插入由Douglas Crockford创建的一些最危险的XSS漏洞take a look at ADSafe。 Google有一个类似的lib,但我忘了它的名字ATM ......
同源政策也不适用于此。通过更改浏览器窗口中地址栏中的网址,您也可以更改window.top.location.href
属性。如果那里存在同源限制,互联网将会死亡。您没有向其他位置发送请求,您没有从第三方资源获取数据并将其加载到您的页面中,而是将浏览器重定向到另一个位置,这会关闭并清除DOM。
答案 1 :(得分: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/
答案 2 :(得分:5)
每当您使用iframes
,frames
或objects
时,您都会设置一个窗口层次结构,这些项目在此层次结构中充当“窗口”。
您可以使用.parent
,.frameElement
等属性遍历此层次结构。属性.top
是层次结构中最高点的窗口,通常对应于最外层的框架。
在层次结构中的窗口之间禁止某些操作,而其他操作则不然。更改窗口的location
不禁止。
最终,那些说你不能这样做的人是不正确的。您无法做的事情是,如果域名不同,则从不同的窗口访问一个窗口的内容。但是,您可以修改其位置属性。
答案 3 :(得分:0)
如果你在同一个域上有两个帧(也有相同的协议和端口),那么一个帧可以将另一个帧重定向到你想要的任何地方,并且还可以访问javascript属性,从另一个帧执行函数等。 / p>
如果您将一个帧从另一个帧重定向到另一个域(或协议或端口),那么由于同源策略,您将无法执行我之前说过的所有操作,但是允许重定向本身,因为在重定向之前,两个帧满足所述策略。
以下是一些有用的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript
从该页面引用:
如果协议,端口(如果是),则两个页面具有相同的来源 指定的),两个页面的主机相同。
显然,frames
与pages
相同。