在 iframe 中使用 window.parent.myFunction 是否安全?



<iframe>的JavaScript中,我需要在父窗口中调用一个函数。这两个窗口来自同一域。

使用window.parent.myFunction();安全吗?

简答

是的,您可以使用来自同一域window.parent

WhatWG规范第6章:加载网页说:

  • iframe.parent存在
  • iframe.parentiframe父级DOM的代理
  • 如果源相同,则允许访问

真的很长很长的答案

我试图向您展示如何通过阅读规范得出这个结论,同时牢记:iframe内访问parent的特征是什么?

让我们开始吧。这是一篇很长的文字。

1. DOM 属性parent

WG#dom-parent 对window.parent的评价:

浏览上下文中DocumentWindow对象的父 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访问功能?让我们推断一下。

  1. parent不是父级的window对象,而是WindowProxy
  2. iframe浏览上下文可以访问其父级,因为它们都具有相同的源(请参阅上面的第一个安全条件)。

你会看到:如果你仔细阅读一个规范,你可以找到浏览器应该如何表现的答案。阅读规范是一项后天习得的技能。它需要耐心和准确。

然而:世界不是那么美好。有些浏览器没有像他们应该的那样实现规范。警告空洞

最新更新