你可以在 window.open() 中使用 rel=opener 吗?

问题描述

我知道您可以在 window.open 中使用“noopener”,它明确告诉您的浏览器禁止子窗口访问父窗口。这应该具有在超链接中使用 rel="noopener" 的效果

但是,Chrome 88 很快(2021 年?)会将“noopener”设为认设置。

那么有没有办法做相反的事情,并将其明确设置为“opener”?这样子窗口就可以访问父窗口了吗?我希望能在我的链接被最新的 Chrome 破坏之前修复它。

我假设它是下面的代码?我不确定在下一版 Chrome 发布之前我会如何测试。但我也不想等到我的链接与下一个版本断开后才进行更改。

window.open(url,'_blank','toolbar=1,menubar=1,location=1,status=1,scrollbars=1,opener')    

window.open(url,scrollbars=1','opener')

解决方法

HTML 规范对此很清楚,您可以查看here.

我将分享window.open步骤的第一部分:

窗口打开步骤,给定一个字符串 url、一个字符串目标和一个 字符串特征,如下:

  1. 如果事件循环的终止嵌套级别非零,则返回 空。

  2. 让源浏览上下文作为入口全局对象的浏览 上下文。

  3. 如果目标是空字符串,则将目标设置为“_blank”。

  4. 让 tokenizedFeatures 成为标记特征的结果。

  5. 让 noopener 和 noreferrer 为假。

  6. 如果 tokenizedFeatures["noopener"] 存在,则:

    1. 将 noopener 设置为解析 tokenizedFeatures["noopener"] 的结果 作为布尔特征。

    2. 移除 tokenizedFeatures["noopener"]。

  7. 如果 tokenizedFeatures["noreferrer"] 存在,则:

    1. 设置 noreferrer 为解析结果 tokenizedFeatures["noreferrer"] 作为布尔特征。

    2. 移除 tokenizedFeatures["noreferrer"]。

  8. 如果 noreferrer 为 true,则将 noopener 设置为 true。

您还可以在 this 错误跟踪器中看到,它与添加的提交相关联,编辑仅与锚点有关。我引用

Anchor target=_blank 表示 rel=noopener

此编辑仅在锚点中完成的原因是使用 window.open 触发此攻击会落入 XSS,因为它需要注入 JavaScript 代码。

此错误所涉及的安全问题是,用户可以将错误代码放入您引用但无权访问的页面中。您可以看到它不需要同源 here. 另一个可能的攻击媒介是当您的网站上有用户生成的内容时,但这不太可能,因为您可能会逃避用户输入的 XSS。

最后一点,此编辑已可供您在 Chrome Canary 中进行测试。

,

我不知道如何测试以确认它 100% 有效,但根据 window.open 的 docswindowFeatures 参数可以作为逗号分隔的键值对传递,其中你有 key=value 所以你可以做 noopener=false。如果您在当前的 chrome 版本中执行此操作,那么新窗口的 window.opener 实际上是前一个窗口,就好像您没有设置任何内容一样,所以我认为它会在新的 chrome 版本出现时起作用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...