为什么子帧可以重定向父帧
Why can a child redirect a parent frame?
我看了这两个问题,但我不明白。
从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>
为什么这是可能的答案非常简单。window.location
是Web API的一部分,它与JavaScript核心并不完全相同。它是DOM接口的一部分,因此它由W3C而非ECMA管理。这就是为什么它允许您操作顶部窗口的属性。
严格地说,JS不能做到这一点,因为它缺乏IO功能,这使得语言非常可移植。这就是为什么浏览器实现需要DOM API来查询DOM,并请求重新绘制或与客户端交互。不过,的DOM确实需要IO,因为它从实际的UI进行渲染和读取。ECMAScript委员会中的一些人宁愿看到对window.top
的访问受到严格限制,如果不是因为XSS漏洞而全部删除的话。遗憾的是W3C同意不同意,并且无论如何都实现了window.top
引用
在这种情况下谁对谁错?我不知道,将客户端重定向到iFrame中的恶意站点很容易,这是不安全的。但是,如果有一个iFrame,然后无法访问顶部窗口,这将意味着无法轻松地与客户端交互,这将是令人沮丧的。但这不是重点。最重要的是,您可以更改一些顶部窗口的属性,会很有用。只要想想mashup。它们在XSS安全方面带来了很多挑战,但为网络地图开辟了许多新的、令人兴奋的可能性。要堵塞一些最危险的XSS漏洞,请查看由Douglas Crockford创建的ADSafe。谷歌也有类似的库,但我忘了它的名字ATM。。。
同源政策在这里也不适用。通过更改浏览器窗口中地址栏中的url,您也在更改window.top.location.href
属性。如果那里有相同来源的限制,互联网就会消亡。您没有将请求发送到其他位置,没有从第三方资源获取数据并将其加载到页面中,而是将浏览器重定向到另一个位置,从而关闭并清除DOM。
我的猜测是,这与您可以执行以下操作的原因相同:
<a href="http://google.com" target="_top">Redirect top to Google</a>
我在这里找到了这种行为的规则:http://www.w3.org/TR/html5/browsers.html#valid-浏览上下文名称或关键字
我找不到"为什么",但就我个人而言,我发现在有人点击iframe中的某个内容后重定向家长很有用。在重定向整个页面之前,您可能需要先执行异步操作并验证某些内容。由于使用<a>
标记已经可以实现这一点,因此在JS中也发现了这一点。但不确定为什么<a>
标签允许该功能。
也就是说,您总是可以通过添加sandbox=""
属性来防止这种行为,例如:http://jsfiddle.net/ppkzS/1/
无论何时使用iframes
、frames
或objects
,都会设置一个窗口层次结构,这些项目在该层次结构中充当"窗口"。
您可以使用.parent
、.frameElement
等属性遍历此层次结构。属性.top
是层次结构中最高点的窗口,通常对应于最外层的帧。
某些操作在层次结构中的窗口之间被禁止,而其他操作则不被禁止。不禁止更改窗口的location
。
归根结底,那些说你不能这样做的人是不正确的。不能从不同的窗口访问一个窗口的内容,如果它们的域不同。但是,可以修改它们的位置属性。
如果你在同一个域上有两个帧(也有相同的协议和端口),那么一个帧可以将另一个重定向到你想要的任何地方,还可以访问javascript属性,从另一个帧执行函数等。
如果您将一个帧从另一个重定向到另一个域(或协议或端口),那么由于同源策略,您将失去执行我之前所述的所有操作的能力,但重定向本身是允许的,因为在重定向之前,两个帧满足所述策略。
以下是一些有用的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript
引用自该页面:
如果协议、端口(如果其中一个为指定)和主机对于两个页面是相同的。
显然,frames
与pages
是相同的。
- 为什么是FB.注销用户功能不会重定向到我告诉它的 URL
- 为什么AJAX调用有时会重定向页面
- 为什么这个请求不会遵循我的龙卷风重定向
- 立即获得重定向.为什么会这样
- 为什么JavaScript URL表单无法工作,也无法重定向
- 为什么第二个链接单击重定向到部分不是对话框
- 为什么每次我在 AJAX 中使用 .load() 时,我的 .ajaxForm() 开始重定向
- 为什么警报会重定向我的页面
- 为什么我的ejs没有在重定向时呈现
- 为什么获胜't我的AJAX帖子重定向到正确的ActionResult
- 为什么子帧可以重定向父帧
- 为什么不'我们在Javascript中重定向后退出/终止脚本
- 为什么window.location没有't重定向页面
- 为什么网站在打开用户链接时,打开一个页面,然后重定向
- 为什么用windows.location重定向到新的URL后会有一个额外的对象
- 为什么这个JavaScript页面重定向这么慢?
- 为什么某些重定向导致Nexus Chrome浏览器不运行Javascript
- 为什么页面在没有完成表单的情况下被重定向到one in action属性
- 为什么ajax调用失败.下面的代码重定向到authenticate.php,而不是返回文本到login.html
- 表单重定向提交不工作,为什么