在<iframe>
的JavaScript中,我需要在父窗口中调用一个函数。这两个窗口来自同一域。
使用window.parent.myFunction();
安全吗?
简答
是的,您可以使用来自同一域window.parent
。
WhatWG规范第6章:加载网页说:
iframe.parent
存在iframe.parent
是iframe
父级DOM的代理- 如果源相同,则允许访问
真的很长很长的答案
我试图向您展示如何通过阅读规范得出这个结论,同时牢记:从iframe
内访问parent
的特征是什么?
让我们开始吧。这是一篇很长的文字。
1. DOM 属性parent
WG#dom-parent 对window.parent
的评价:
浏览上下文中
Document
的Window
对象的父 IDL 属性 b 必须返回父浏览上下文的WindowProxy
对象(如果有)(即,如果 b 是子浏览上下文),或者浏览上下文b本身的WindowProxy
对象,否则(即,如果它是顶级浏览上下文或分离的嵌套浏览上下文)。
parent
是访问父窗口的 DOM 之类的属性。然而:
- 什么是浏览上下文?
WindowProxy
做什么?
让我们继续阅读。
2. 浏览上下文
浏览上下文是向用户显示Document
对象的环境。
什么WG#浏览上下文说:
Web 浏览器中的选项卡或窗口通常包含浏览上下文,框架集中的 iframe 或框架也是如此。每个浏览上下文都有一个相应的 WindowProxy 对象。
3.窗口代理
窗口代理是用于代理window
对象并强制实施安全约束等的对象。对于window
对象,可以有多个代理(例如,来自两个不同域的两个iframes
访问同一父级)。
WhatWG#proxy-object 说:
WindowProxy 对象允许脚本像每个浏览上下文具有单个 Window 对象一样运行,同时仍为每个文档保留单独的 Window 对象。
4.安全
我们快到了。继续阅读。
WhatWG#security-nav 说:
如果满足以下条件之一,则允许浏览上下文 A 导航第二个浏览上下文 B:
- A 的活动文档的原点与 B 的活动文档的原点相同,或者
- 浏览上下文 A 是具有顶级浏览上下文的嵌套浏览上下文,其顶级浏览上下文为 B,或
- 浏览上下文 B 是辅助浏览上下文,允许 A 导航 B 的打开器浏览上下文,或者
- 浏览上下文 B 不是顶级浏览上下文,但存在 B 的祖先浏览上下文,其活动文档与 A 的活动文档具有相同的来源(实际上可能是 A 本身)。
5. 扣除
如果iframe
来自同一域,是否可以从其parent
访问功能?让我们推断一下。
parent
不是父级的window
对象,而是WindowProxy
。iframe
的浏览上下文可以访问其父级,因为它们都具有相同的源(请参阅上面的第一个安全条件)。
你会看到:如果你仔细阅读一个规范,你可以找到浏览器应该如何表现的答案。阅读规范是一项后天习得的技能。它需要耐心和准确。
然而:世界不是那么美好。有些浏览器没有像他们应该的那样实现规范。警告空洞。