我最近一直在调查帧破坏代码,并且遇到了一些与我无法理解的同源策略相关的非常奇怪的行为。
假设我在域 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 位于不同的域中。更奇怪的是,似乎 top.location只写:
// Fails if Container.html is on a different domain than Breaker.html
alert(top.location);
这对我来说是有问题的,因为我正在尝试编写允许我的页面位于 iframe 中的代码,但前提是它与其父级位于同一域中(或者位于配置的允许域中)。但是,似乎无法确定这一点,因为同源政策拒绝我访问父母的位置。
所以我有两个问题,基本上:
为什么上面的帧中断代码完全起作用?
有没有办法有条件地打破框架,或者唯一能做的检查是是否
top !== self
?(特别是,我希望能够读取域,以便我可以提供允许域的列表;简单地检查我是否在同一个域中并不理想。)