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

时间:2012-10-18 17:39:38

标签: javascript html

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

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

1 个答案:

答案 0 :(得分:2)

简短回答

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

WhatWG specification chapter 6: Loading Web pages说:

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

真的很长,答案很长

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

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

1。 DOM属性parent

WhatWG#dom-parentwindow.parent

  

浏览上下文 b Window的{​​{1}}对象上的父IDL属性必须返回父浏览的Document对象context ,如果有的话(即 b 是子浏览上下文),或浏览上下文的WindowProxy对象 b 本身,否则(即,如果它是顶级浏览上下文或分离的嵌套浏览上下文)。

WindowProxy是访问父窗口的DOM之类的属性。但是:

  • 什么是浏览上下文
  • parent做什么?

让我们继续阅读。

2。浏览上下文

浏览上下文是向用户显示WindowProxy个对象的环境。

WhatWG#Browsing context说:

  

Web浏览器中的选项卡或窗口通常包含浏览上下文,框架集中的iframe或框架也是如此。每个浏览上下文都有一个对应的WindowProxy对象。

3。窗口代理

窗口代理是一个代理Document对象并强制执行安全约束的对象。对于window对象,可以有多个代理(例如来自两个不同域的两个window访问同一个父代。)

WhatWG#proxy-object说:

  

WindowProxy对象允许脚本像每个浏览上下文一样有一个Window对象,同时仍为每个Document保留单独的Window对象。

4。安全

我们快到了。继续阅读。

WhatWG#security-nav说:

如果满足下列条件之一,则允许浏览上下文A导航第二个浏览上下文B:
  • A的活动文档的来源与B的活动文档的来源相同,或者
  • 浏览上下文A是具有顶级浏览上下文的嵌套浏览上下文,其顶级浏览上下文为B,或者
  • 浏览上下文B是辅助浏览上下文,允许A导航B的开启者浏览上下文,或者
  • 浏览上下文B不是顶级浏览上下文,但存在B的祖先浏览上下文,其活动文档与A的活动文档具有相同的来源(实际上可能是A本身) 。

5。扣

如果两个来自同一个域,iframes是否可以从iframe访问其功能?让我们推断。

  1. parent不是父级的parent对象,而是window
  2. WindowProxy浏览上下文可以访问其父级,因为它们都具有相同的来源(请参阅上面的第一个安全条件)。
  3. 您会看到:如果仔细阅读规范,您可以找到浏览器应该如何运作的答案。阅读规范是获得的技能。它需要耐心和准确。

    然而:世界并不那么美好。有些浏览器不能实现规范。 警告经纪人