如何防止 iframe 访问父框架?

Posted

技术标签:

【中文标题】如何防止 iframe 访问父框架?【英文标题】:How can I prevent an iframe from accessing parent frame? 【发布时间】:2012-01-13 12:34:55 【问题描述】:

我有一个带有 iframe 的页面。 iframe 的页面和来源位于不同的域中。在 iframe 中,我使用了一个名为 CuteEditor 的富文本编辑器(结果证明它并不那么可爱)。 CuteEditor 中有某些 javascript 函数会尝试访问“文档”,但浏览器拒绝访问,因为它们不在同一个域中。

这是确切的错误:

访问属性“文档”的权限被拒绝 http://dd.byu.edu/plugins/cuteeditor_files/Scripts/Dialog/DialogHead.js 1号线

编辑 javascript 是不可能的,因为它已被压缩和混淆,所以所有变量名称都是神秘的。

目前无法使用其他编辑器,因为这是一个工作项目,而且这是我被告知要使用的编辑器。

有没有办法让 iframe 保持独立?所以它会在 iframe 内完成所有操作,并且不会尝试突破到父框架?

【问题讨论】:

【参考方案1】:

您不必担心会发生这种情况。

iframe 可以跨域通信的唯一方法是使用 postMessage,而这只有在您直接收听该域时才有可能。

https://developer.mozilla.org/en/DOM/window.postMessage

【讨论】:

然而,由于这个错误,CuteEditor 在 iframe 中不起作用。那么这是一个不同的问题吗?【参考方案2】:

如果子 iframe 是从不同的域加载的,那么它将无法访问父页面或 DOM。

但是,中间人攻击仍然存在一个可能的漏洞,如下所示。假设你的页面加载了http://yoursite.com 并且 iframe 转到了http://badsite.org

第一个 http://badsite.org 重定向到 http://yoursite.com/badpage

这是需要中间人攻击的步骤。攻击者必须能够在用户和 yoursite.com 之间取得联系,或者控制您的 DNS 查询的答案。这比听起来容易——任何对公共 WiFi 接入点具有管理控制权的人都可以做到(想想星巴克、酒店、机场。)目标是从攻击者的站点提供 http://yoursite.com/badpage 的内容,而不是你的实际站点网站。

然后攻击者可以从(假的)http://yoursite.org/badpage 提供他们喜欢的任何恶意代码。因为它与主页面在同一个域中,所以它可以访问父 DOM。

html5 iframe 沙盒属性似乎是避免这种情况的方法。您可以阅读spec,但最好的描述可能是here。

Chrome、IE10、FireFox、Safari 似乎支持此功能。

规范说,如果 not 设置了“allow-same-origin”属性,“内容将被视为来自唯一来源。”这应该可以防止您的子 iframe 访问父 DOM 的任何部分,无论浏览器认为 URL 是什么。

【讨论】:

攻击并不像所说的那么容易。当设备从 DNS 获取到 yoursite.com 的地址时,它将缓存以供进一步访问。要完全实施这种攻击,需要 HTTP 代理,中间人必须重写网页以使用 yoursite.com/badpage 作为 iframe src。如果您使用 HTTPS,这会更加复杂,因为代理必须将 HTTPS 模仿为 HTTP 才能更改页面。这并非不可能,但除非该网站对攻击者有吸引力(如银行、拍卖或可用于获取密码的访问量很大的网站),否则您的曝光率很低。 这似乎并不牵强,除非您有证据表明 CuteEditor 实际上是非法产品和恶意脚本。 这里的攻击没有多大意义。如果攻击者控制了您的 DNS,他们可以使用更简单的攻击:他们可以简单地将您在 yoursite.com 上的 原始 页面加载重定向到他们的恶意服务器并运行任意恶意 JavaScript 代码。如果攻击者控制了您的 DNS,那么 iframe 对于攻击者可能想要做的任何事情都是多余的。

以上是关于如何防止 iframe 访问父框架?的主要内容,如果未能解决你的问题,请参考以下文章

iframe跨域访问父框架js方法

如何使用 jquery 访问 iFrame 父页面?

如何防止 iFrame 中的 JavaScript 访问外部站点的属性,即使 iFrame 的内容来自同一来源?

iframe如何在chrome扩展中访问父窗口

如何从跨域 iframe 中访问父窗口的 window.orientation?

如何防止我的网站页面通过iFrame的第三方网站框架加载