如何防止 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 中的 JavaScript 访问外部站点的属性,即使 iFrame 的内容来自同一来源?