可以将 rel=opener 与 window.open() 一起使用吗?

can you use rel=opener with window.open()?

我知道您可以将“noopener”与 window.open 一起使用,它明确告诉您的浏览器禁止子 window 访问父 window。这应该会影响在 hyperlink.

中使用 rel="noopener"

但是,Chrome88 很快(2021 年?)将使“noopener”成为默认值。

那么有没有办法反其道而行之,明确地设置为“opener”呢?这样子 window 就可以访问父 window 吗?我希望在我的 link 与最新的 Chrome.

中断之前修复它

我想应该是下面的代码吧?我不确定在下一个 Chrome 版本发布之前如何测试它。但我也不想等到我的 link 在下一个版本中中断后才进行此更改。

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

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

我不知道如何测试它以确认它 100% 有效,但根据 docs for window.open,windowFeatures 参数可以作为逗号分隔键传递-你有 key=value 的值对,所以你可以做 noopener=false。如果您在当前 chrome 版本中执行此操作,那么新 window 的 window.opener 实际上是之前的 window 就好像您没有设置任何东西一样,所以我认为新的 chrome 版本发布后可以使用。

HTML规范对此有明确规定,可以查看here.

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

The window open steps, given a string url, a string target, and a string features, are as follows:

  1. If the event loop's termination nesting level is nonzero, return null.

  2. Let source browsing context be the entry global object's browsing context.

  3. If target is the empty string, then set target to "_blank".

  4. Let tokenizedFeatures be the result of tokenizing features.

  5. Let noopener and noreferrer be false.

  6. If tokenizedFeatures["noopener"] exists, then:

    1. Set noopener to the result of parsing tokenizedFeatures["noopener"] as a boolean feature.

    2. Remove tokenizedFeatures["noopener"].

  7. If tokenizedFeatures["noreferrer"] exists, then:

    1. Set noreferrer to the result of parsing tokenizedFeatures["noreferrer"] as a boolean feature.

    2. Remove tokenizedFeatures["noreferrer"].

  8. If noreferrer is true, then set noopener to true.

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

Anchor target=_blank implies rel=noopener

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

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

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