【问题标题】:can you use rel=opener with window.open()?您可以将 rel=opener 与 window.open() 一起使用吗?
【发布时间】:2020-12-21 23:24:42
【问题描述】:

我知道您可以在 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,'_blank','toolbar=1,menubar=1,location=1,status=1,scrollbars=1', 'opener')

【问题讨论】:

  • 我没有找到对这个 here 的引用。您从哪里得知这将很快成为默认设置?
  • 哦,看看here
  • 我想我们只需要等待官方 Chrome 博客文章告诉我们如何在它发布时启用它
  • @NL3294 我的回答有问题吗?

标签: javascript window.open rel


【解决方案1】:

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

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

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

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

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

  3. 如果 target 是空字符串,则将 target 设置为“_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 为真,则将 noopener 设置为真。

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

Anchor target=_blank 暗示 rel=noopener

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

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

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

【讨论】:

  • 谢谢,我刚刚将此标记为答案。但是你能解释一下为什么锚需要这个修复而不是 window.open 吗?如果我在不使用 noopener 的情况下使用 target=_blank 将锚点放在 blah.com,那么他们可以使用 tabnap。如果我用 target=_blank 将 window.open 放到同一个站点,没有 noopener,那怎么会更安全?
  • @NL3294 作为开发人员,您可以控制window.open 的行为,所以如果您没有通过noopener,那么您希望opener 被填充。这不是 url 发生的情况。您可以使用锚链接到任何其他站点。但是,当您想控制具有功能的新选项卡时,您只能使用window.open。想象一下,您在 Facebook 上分享了一些内容,并且任何点击该链接的人都会被打盹,因为 facebook 没有实现任何开启器。 window.open 纯粹用于控制子级,因此默认情况下需要链接到部分。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2020-11-23
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多