我最近一直在调查
frame breaking代码,并且遇到了一些与
same origins policy有关的非常奇怪的行为,我无法理解.
假设我在域A上有一个Breaker.html页面,在域B上有一个Container.html页面.示例框架代码将进入Breaker.html,如下所示:
if (top !== self) top.location.href = self.location.href;
这将成功地将Breaker.html从Container.html中删除,但我不明白为什么它应该.从我对同一起源政策的阅读,top.location不可访问,因为Container.html位于与Breaker.html不同的域上.即使是weirder,似乎top.location只写:
// Fails if Container.html is on a different domain than Breaker.html alert(top.location);
这对我来说是有问题的,因为我正在尝试编写允许我的页面位于iframe中的代码,但只有当它的父级(或者在配置的允许域上)处于同一个域上时.然而,似乎不可能确定这一点,因为同一起源的政策拒绝我访问父母的位置.
所以我有两个问题,基本上是:
>为什么上述框架代码可以工作?
>有什么办法有条件地破帧,还是唯一可以做的检查是顶级!==自我? (特别是,我想要能够阅读域名,以便我可以提供一个允许的域名列表,只需检查我是否在同一个域中也不会是理想的.)
解决方法
你的答案为1:在安全性方面,读访问和写访问有很大的区别.能够读取top.location.href是一个安全问题.能够写入top.location.href不是.
对于您的问题的答案,我不知道javascript足够好,以确保,但一个想法将是假设,如果阅读top.location失败(检查异常),它是在一个不同的域.