为什么浏览器不允许脚本关闭打开器窗口,但允许更改其位置?

信息安全 网页浏览器 javascript
2021-09-02 00:39:44

浏览器通常不允许子选项卡/窗口使用脚本关闭其开启器。然而,它们确实允许孩子改变开启标签/窗口的位置

这导致了一个奇怪的解决方法,您可以创建一个页面,该页面在加载后立即用脚本关闭,然后将父选项卡/窗口的位置更改为这个新页面,有效地关闭它。

这让我问,什么安全问题导致禁用关闭打开器选项卡/窗口的能力,这种解决方法是否有效地创建了后门?

1个回答

浏览器通常不允许子选项卡/窗口使用脚本关闭其开启器。然而,它们确实允许孩子改变开启标签/窗口的位置

这并不完全准确。如果您仔细阅读引用的 MDN 文本,它实际上是指 . 的开头,parent不是popup. 您可能遇到的实际限制是:

  • 脚本只能关闭最初由脚本打开的窗口。

因此,在您的具体示例中,popup是由脚本打开的,但opener是由用户打开的,因此openerdclose本身或popup.

想象一下有两个弹出窗口的场景

  • 用户打开的选项卡(不能是closed)
  • 弹出窗口 1(opener是用户打开的选项卡)
  • 弹出窗口 2(opener是弹出窗口 1)

在这种情况下,弹出 2可以弹出 1。 但是,弹出窗口 1 不能显示用户打开的选项卡,因为这违反了上述规则。close
close

  • popup在 Chrome 和 Firefox 中, s 是否与它们的 s 同源并不重要opener根据我上面的第一点,可以根据需要更改popuplocationcloseopener

  • 在 IE11 中,popup可以closeparent但不能更改parent.location,除非它符合Same Origin policy(如果您尝试,会出现新的弹出窗口)

另外,我想澄清一下,任何人opener都可以close拥有自己的 s 或不受限制地popup更改它们。location出于安全原因,对内容的访问popup仍需遵守同源政策。

这导致了一个奇怪的解决方法,您可以创建一个页面,该页面在加载后立即用脚本关闭,然后将父选项卡/窗口的位置更改为这个新页面,有效地关闭它。...这种解决方法是否有效地创建了一个后门?

要直接回答您的问题,没有这样的解决方法。链接的示例将产生错误:

脚本可能不会关闭不是由脚本打开的窗口。

除非您像我上面解释的那样处于 2-popup 的情况,在这种情况下,它可能popup只是直接的。不过,在这种情况下,解决方法将是不必要的。closeopener