【问题标题】:Is it safe to use window.parent.myFunction in an iframe?在 iframe 中使用 window.parent.myFunction 是否安全?
【发布时间】:2012-10-09 06:08:47
【问题描述】:

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

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

【问题讨论】:

  • 我的两个担忧是 1. 不同版本的浏览器以不同的方式提供对该功能的访问。窗口.parent.myFun,窗口.parentWindow.myFunc。 2. 安全设置阻止它。

标签: javascript html


【解决方案1】:

简答

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

WhatWG specification chapter 6: Loading Web pages 说:

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

真的很长很长的答案

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

让我们开始吧。很长的一段文字。

1。 DOM 属性parent

WhatWG#dom-parentwindow.parent

浏览上下文中DocumentWindow 对象的父IDL 属性b 必须返回父浏览上下文WindowProxy 对象,如果有一个(即如果 b 是子浏览上下文),或浏览上下文 b 本身的WindowProxy 对象,否则(即如果它是顶部级浏览上下文或分离的嵌套浏览上下文)。

parent 是一个用于访问类似于父窗口的 DOM 的属性。然而:

  • 什么是浏览上下文
  • WindowProxy 有什么作用?

让我们继续阅读。

2。浏览上下文

浏览上下文是向用户呈现Document 对象的环境。

WhatWG#Browsing context 说:

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

3。窗口代理

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

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。扣除

如果两者都来自同一个域,iframe 能否从其parent 访问函数?让我们推断。

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

您会看到:如果您仔细阅读规范,您可以找到浏览器应该如何运行的答案。阅读规范是一项后天的技能。这需要耐心和准确。

然而:这个世界并不那么美好。有些浏览器没有按照它们应该的那样实现规范。 告诫购买者

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 2021-10-17
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2012-02-22
    • 2016-05-12
    • 2011-12-12
    相关资源
    最近更新 更多