我一直在调查 打破框架 最近编写代码并遇到了一些与以下相关的非常奇怪的行为 同源政策 我很难理解。

假设我在域 A 上有一个 page 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 中的代码,但前提是它与其父级位于同一域中(或者位于配置的允许域中)。然而,似乎无法确定这一点,因为同源政策拒绝我访问父母的位置。

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

  1. 为什么上面的断帧器代码能起作用?

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

有帮助吗?

解决方案

对你的回答数1:在安全方面存在很大的差读访问和编写访问。能够阅读上面。位置。href是一个安全问题。能够 到顶部。位置。href不是。

至于你问题的答案,我不知道javascript以及足够肯定,但一个想法是assumine,如果阅读上面。位置出现故障(检查的例外情况),它是在一个不同的领域。

其他提示

对问题1的回答是,平等操作人员可用来对上面。位置。href为旧的原因。Breaker.html 无法读取顶部。位置。href但它可以比较的另一个价值。

对问题2的答复则就变得没有,你必须使用的!== 部分因为你不能做个串上。位置。href从一个交叉领域breaker.html.

我可能是错的但是我了解的当前框架的世界。

这是针对问题 2 的:如果你想获取parent.location(而不是top.location)的HREF,你可以这样做:

if ((window.top === window.parent) && (history.length==1)) parentHREF=document.referrer;

基本上这段代码的作用是:
[1] 检查父框架是否是顶部框架,因为即使它不是顶部框架,您也只能获取父框架的 HREF。
[2] 在加载其源代码之前检查 iframe 的历史记录是否为空,因为如果不是......document.referrer 将返回该帧历史记录中的最后一个 HREF。

之后,你又遇到了一个新问题:如果history.length的值大于1,您可以使用主机名白名单来检查是否必须打开它:

if ([location.hostname, 'stackoverflow.com'].indexOf(location.hostname)>=0) hasToBeOpened=true;

请注意,您还有另一个选择:可以使用登陆页面来检查“第一个”页面是否必须打开,请使用以下代码:

<head>
<script>
var parentHREF;
if ((window.top === window.parent) && (history.length==1)) parentHREF=document.referrer;
if (/*conditions mentiones above*/) document.write("<META http-equiv='refresh' content='0;URL=http://example.com/go-here.html'>");
</script>
</head>

通过这种方式,“第一”页将替换历史记录的第一个(在本例中为第一个)值。该代码假设“example.com”是您的域。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top