为什么一个来自不同域名的 iframe 可以改变父窗口的 URL?

4

我有两个域名:

sub1.domain.org 包含一个指向另一个域名 sub2.domain.org 的 iframe。

在 sub2 上:

//triggers a cross-domain security error
alert(window.parent.location.href);

//executes just fine on FF, IE, Chrome, and Safari.
window.parent.location.href = new_url; 

所以看起来我可以写入父窗口的URL,但是不允许读取。这是标准吗?我只是想知道为什么会这样工作。
我在这里找到了一个答案: 为什么子窗口可以重定向父窗口? 引用:
同源策略也不适用于此处。通过在浏览器窗口中更改地址栏中的URL,您也会更改window.top.location.href属性。如果那里有同源限制,互联网就会崩溃。您没有向另一个位置发送请求,也没有从第三方资源获取数据并将其加载到页面中,而是将浏览器重定向到另一个位置,从而关闭并清除DOM。


但这个答案引发了其他后续问题。
当我们更改父级的URL时,难道我们不是在技术上修改父级的DOM (即使它关闭了) ,因此违反了同源策略吗?
如果同源策略应用于此处,互联网会怎样呢?我们可以将人工输入URL与通过位于不同域的脚本更改URL区分开来。
我理解这种情况不违反同源策略,但我仍然很难理解为什么会允许这样做。有人能提供更多的洞见来解释为什么允许吗?

1
请原谅我,因为我已经进行了太长时间的位移操作,所以我有点傻,但如果域名相同(例如上面的domain.org),它真的被认为是跨站脚本吗?我的意思是,我知道子域名只是映射到IP地址,但所有权无法分割。无论谁拥有sub1.domain.org,也始终完全拥有sub2.domain.org的所有权?我同意您关于无法阅读报告似乎很愚蠢的说法,在这种情况下,我建议将读取错误更改为虚假负面。也许我对出售子域名的合法性不正确。 - Jesse Ivy
1个回答

3
在iframe更改父窗口的URL时并不会存在安全问题,这只是将新页面加载到父窗口中(因此杀死了最初包含在父窗口中的iframe)。在这里没有安全问题。
来自不同来源的iframe不能访问父级内容,因为这可能会有安全隐患。
FYI,反之亦然。父框架可以创建一个iframe,并将其.src设置为任何它想要的,包括其他域,但无法访问加载的内容。核心问题在于,显示来自其他域的内容不是安全问题,但访问来自不同来源的实际内容可能会存在安全问题。因此,通常允许您显示任何内容,但不能访问它。
FYI,检测是否被框架化并通过重置父窗口源URL退出框架的能力称为“窗口破坏”,认为内容提供者有权决定他们是否可以被框架或由谁框架。现在有更新的控件指定是否可以框架网站,因此在更新的浏览器中不需要进行窗口破坏。

您可以访问 iframe 的内容。var $iframe = $("#iframeID").contents(); $iframe.find('selector'); - OG Sean
2
@OGSean - 仅在相同域名下。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接