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

NL3*_*294 7 javascript rel window.open

我知道你可以在 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')    
Run Code Online (Sandbox Code Playgroud)

或者

window.open(url,'_blank','toolbar=1,menubar=1,location=1,status=1,scrollbars=1', 'opener')
Run Code Online (Sandbox Code Playgroud)

小智 7

HTML 规范对此很清楚,您可以在此处查看。

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

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

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

  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。

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

Anchor target=_blank 意味着 rel=noopener

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

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

最后要注意的是,此编辑已可供您在 Chrome Canary 中进行测试。