为什么断路器跨域工作,您是否可以有条件地使用断路器?

Dan*_*Lew 10 javascript iframe same-origin-policy

我最近一直在调查破帧代码,并且遇到了一些与我理解困难的相同起源政策相关的奇怪行为.

假设我在域A上有一个Breaker.html页面,在域B上有一个页面Container.html.示例帧断路器代码将进入Breaker.html,如下所示:

if (top !== self) top.location.href = self.location.href;
Run Code Online (Sandbox Code Playgroud)

这将成功地将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);
Run Code Online (Sandbox Code Playgroud)

这对我来说是有问题的,因为我正在尝试编写允许我的页面位于iframe中的代码,但前提是它与其父级位于同一个域中(或者位于配置的允许域中).但是,似乎无法确定这一点,因为相同的起源政策拒绝我访问父母的位置.

所以我有两个问题,基本上:

  1. 为什么上面的断路器代码可以工作?

  2. 有没有办法有条件地打破框架,或者是唯一可以做的检查是否top !== self?(特别是,我希望能够读取域名,以便我可以提供允许域名列表;只是检查我是否在同一个域中是不理想的.)

Bri*_*ian 1

对于您对第一个问题的回答:就安全性而言,读访问和写访问之间存在很大差异。能够读取 top.location.href 是一个安全问题。无法写入top.location.href

至于你问题的答案,我对 javascript 的了解不够确定,但一个想法是假设如果读取 top.location 失败(检查异常),那么它位于不同的域上。

  • 写入 top.location.href 不会设置外部文档的任何属性;相反,它会卸载前一个文档并在其位置加载一个新文档。 (2认同)