如果我创建一个小部件并将其嵌入到<iframe>
来自不同域的站点中,该小部件可以读取多少关于父页面的数据?
显然没有 DOM 访问权限,但是有没有其他信息的访问权限,比如父页面是否有父页面,或者父页面的 url 是什么?
如果我创建一个小部件并将其嵌入到<iframe>
来自不同域的站点中,该小部件可以读取多少关于父页面的数据?
显然没有 DOM 访问权限,但是有没有其他信息的访问权限,比如父页面是否有父页面,或者父页面的 url 是什么?
通常,从不同域提供的 iframe 的内容无法以任何方式访问父级。这就像在不同的浏览器选项卡中加载页面。
但是,即使从不同的域提供服务,也可能存在中间人攻击,这将允许访问父 DOM。这比听起来容易——任何对公共 WiFi 接入点具有管理控制权的人都可以实施这种攻击(想想星巴克、酒店、机场。)
可以使用 HTML5 iframe 沙盒属性来防止这种攻击——见下文。
中间人攻击的工作原理如下。假设您的页面从http://yoursite.com加载,并且 iframe 转到http://badsite.org
这是需要中间人攻击的步骤。攻击者必须能够在用户和 yoursite.com 之间取得联系,或者控制您的 DNS 查找的答案。目标是从攻击者的站点提供http://yoursite.com/badpage的内容,而不是您的实际站点。
然后,攻击者可以从(假的) http://yoursite.org/badpage提供他们喜欢的任何恶意代码。因为它与主页面在同一个域中,所以它可以访问父 DOM。
HTML5 iframe 沙盒属性似乎是避免这种情况的方法。您可以阅读规范,但最好的描述可能在这里。
这似乎在Chrome、IE10、FireFox、Safari上受支持。
规范说,如果未设置“allow-same-origin”属性,“内容将被视为来自唯一来源。” 这应该可以防止您的子 iframe 访问父 DOM 的任何部分,无论浏览器认为 URL 是什么。
Sandbox 还允许您禁用脚本、弹出窗口、更改顶级 URL 的功能以及其他功能。
我做了一点谷歌搜索,结果发现如果内容是另一个域(同源策略),通常你无法访问 Iframe 的内部内容,但是这里有一篇文章可以为你提供一些解决方法。