为啥 iframe 可以从不同的域更改父窗口的 URL?

Posted

技术标签:

【中文标题】为啥 iframe 可以从不同的域更改父窗口的 URL?【英文标题】:Why can an iframe change the parent window's URL from a different domain?为什么 iframe 可以从不同的域更改父窗口的 URL? 【发布时间】:2015-02-15 13:34:44 【问题描述】:

我有两个域:

sub1.domain.org 包含一个 iframe,其 src 指向另一个:sub2.domain.org

在子 2 上:

//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,但不允许我读取它。这真的是标准吗?我只需要知道为什么会这样。

我在这里找到了一个答案:Why can a child redirect a parent frame?

同源政策也不适用于此处。通过更改网址 在浏览器窗口的地址栏中,您正在更改 window.top.location.href 属性也是如此。如果有同源 那里的限制,互联网将死。你没有发送 请求到另一个位置,您没有从 第三方资源并将其加载到您的页面中,您正在重定向 浏览器移动到另一个位置,这会关闭并清除 DOM。

但这个答案会引发其他后续问题。

当我们更改父级的 URL 时,我们是不是仍然在技术上修改父级的 DOM(即使它关闭它)并因此违反同源策略?

如果在这里应用相同的来源策略,互联网究竟会死多少?当然,我们可以将在地址栏中手动输入 URL 与通过单独域上的脚本更改 URL 区分开来。

我知道这个案例没有违反同源政策,但我仍然在努力理解为什么。任何人都可以进一步了解为什么允许这样做吗?

【问题讨论】:

请原谅,我是个白痴,一直在位移太久,但是如果域相同(上面示例中的 domain.org)真的被认为是跨站点脚本吗?我的意思是我意识到子域只是映射到 IP 地址,但所有权不能分割。谁拥有 sub1.domain.org,100% 的时间也拥有 sub2.domain.org 的所有权?我同意您关于无法阅读的报告似乎很愚蠢,在这种情况下,我建议阅读错误是误报,应该更改。也许我对出售子域的合法性不正确。 【参考方案1】:

iframe 更改父窗口的 URL 不是安全问题。这只会将一个新页面加载到父窗口中(从而杀死原始父窗口中包含的 iframe)。那里没有安全问题。

来自不同来源的 iframe(如您所见)不允许访问父级的内容,因为这可能是一个安全问题。

仅供参考,反之亦然。父框架可以创建一个 iframe 并将其设置为 .src 任何它想要的,包括其他域,但不能访问加载的内容。这里的核心问题是显示来自其他域的内容不是安全问题,但访问来自不同来源的实际内容可能是安全问题。因此,您通常可以显示您想要的任何内容,但不能访问它。

仅供参考,通过重置父窗口源 URL 来检测您是否被框架和“破坏”出框架的能力被称为“框架破坏”,它被认为是内容提供者有权决定它们是否可以被陷害或不被陷害,或者他们可以被谁陷害。现在有更新的控件可以指定是否可以对网站进行框架化,因此在新的浏览器中不需要框架破坏。

【讨论】:

您可以访问 iframe 的内容。 var $iframe = $("#iframeID").contents(); $iframe.find('选择器'); @OGSean - 仅当域相同时。

以上是关于为啥 iframe 可以从不同的域更改父窗口的 URL?的主要内容,如果未能解决你的问题,请参考以下文章

从 iFrame 更改父窗口 URL

从不同域的 iframe 滚动到父级顶部

允许子 iframe 从不同域调用其父窗口上的函数

为啥从 Python 中的对象继承,在不指定父对象时更改 __dict__ 的类型不会? [复制]

为啥 Firefox 中的网络字体不能在不同的域上工作?

为啥将您的 Javascript 文件移动到您也拥有的不同主域?