与 target="_blank" 和 rel="noopener noreferrer" 的链接仍然容易受到攻击?

     2023-02-21     142

关键词:

【中文标题】与 target="_blank" 和 rel="noopener noreferrer" 的链接仍然容易受到攻击?【英文标题】:Link with target="_blank" and rel="noopener noreferrer" still vulnerable? 【发布时间】:2018-11-15 12:04:55 【问题描述】:

我看到有人建议,每当在链接中使用target="_blank" 以在不同的窗口中打开它时,他们应该输入rel="noopener noreferrer"。例如,我想知道这如何阻止我在 Chrome 中使用开发者工具并删除 rel 属性。然后点击链接...

这是保持漏洞的简单方法吗?

【问题讨论】:

您认为它会(或不会,在这种情况下)提供什么样的保护? 我正在考虑可以操作 DOM 的浏览器扩展。 Firefox 79 会自动执行此操作(至少,noopener,但正如下面指出的,noreferrer 是冗余的):hacks.mozilla.org/2020/07/firefox-79 【参考方案1】:

您可能误解了该漏洞。你可以在这里阅读更多信息:https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/

本质上,将rel="noopener noreferrer" 添加到链接可以保护您网站的用户免受链接到的网站可能劫持浏览器(通过流氓JS)。

您询问的是通过开发人员工具删除该属性 - 这只会将(篡改该属性的人)潜在地暴露给漏洞。

2021 年更新:所有当前版本的主要浏览器现在自动对任何 target="_blank" 链接使用 rel="noopener" 的行为,从而消除此问题。在chromestatus.com 上查看更多信息。

【讨论】:

noopener noreferrer 是多余的,因为noreferrer 包含noopener 的功能。 html.spec.whatwg.org/multipage/links.html#link-type-noreferrer 如果它是多余的,为什么 Visual Studio Code 需要两者? 根据答案中的链接,Firefox 无法识别 noopener,因此您还需要包含 noreferrer @AndrewEinhorn 根据 caniuse 的说法,Firefox 已经支持 noopener 好几年了,但 IE11 永远不会。 caniuse.com/rel-noopener Setting target="_blank" on <a> elements now implies rel="noopener" behavior 适用于许多浏览器;有关支持状态,请参阅 browser compatibility。【参考方案2】:

带有target="_blank" 的链接are vulnerable 以在用户的​​注意力被新打开的标签转移时,在后台换出引荐来源页面。这被称为reverse tabnapping

引用页面存储在window.opener,恶意网站可以通过以下方式修改:

if (window.opener) 
   window.opener.location = "https://phish.example.com";

添加rel="noopener noreferrer" 可修复所有主流浏览器中的此漏洞。

请注意,理论上您可以通过操作删除rel client-side...但是您为什么要这样做?你所做的只是故意让自己容易受到攻击。

访问同一网站(并且不修改自己的客户端代码)的其他用户仍然是安全的,因为服务器仍会提供 rel="noopener noreferrer"。您将其删除仅适用于您。

【讨论】:

随便逛逛,rel="noopener noreferrer" 对我的内部应用程序有什么好处?它打开同一个内部域,在同一个内部网络中,它引用某个外部站点的可能性为 0。如果它仍然有益,为什么不将它添加到所有链接中?【参考方案3】:

浏览器修复

所有主要浏览器都已通过更新默认行为以确保安全,而无需指定 rel 属性来解决此问题。在About rel=noopener 阅读更多内容。

Chrome fixed it 在 v88 Safari fixed it 2016 年! Firefox fixed it v52 New Edge 是基于 Chromium 的,因此也已修复

【讨论】:

我要补充一点,Edge 现在也是如此,因为它是 Chromium。【参考方案4】:

关于Lighthouse Best Practices audits报告:

rel="noopener"rel="noreferrer" 添加到任何外部链接 提高性能并防止安全漏洞。

一般来说,当你使用target="_blank"时,一定要加上rel="noopener"rel="noreferrer"

例如:

<a href="https://www.kaiostech.com/store/" target="_blank" rel="noreferrer">
  KaiStore
</a>
rel="noopener" 阻止新页面访问 window.opener 属性,并确保它在单独的进程中运行。 rel="noreferrer" 具有相同的效果,但也会阻止 Referer 标头被发送到新页面。

请参阅official document 了解更多信息。

【讨论】:

两个都可以加吗? 是的@blessed 你可以像rel="noopener noreferrer"一样添加两者【参考方案5】:

没有答案指出您实际上想要传递推荐人而忽略任何“安全风险”警告的情况:例如,当您链接您自己的外部网站时 strong>,由您/您的组织控制,可能没有描述的安全漏洞。

例如,在我的例子中,我想在 Google Analytics 中查看有多少访问者通过点击网络应用程序内的链接来阅读文档(该应用程序使用与文档所在位置不同的域)以及有多少来自搜索引擎,因此我想利用引用标题来区分这些用户组。

在链接网站(例如您自己的文档)时,您可以这样做:

/* Safe link to the own website *//* eslint-disable-next-line react/jsx-no-target-blank */
<a href="https://my-own-website.com" target="_blank">
  Learn more
</a>

在 React 中,我制作了一个 wrapper common 组件以避免在代码中的任何地方放置 eslint-disable(与 UnsafeExternalLink 组件相反):

import React,  ReactNode  from 'react';

/* eslint-disable react/jsx-no-target-blank */

/**
 * Safe link to own external websites only.
 */
const SafeExternalLink = (
  href,
  children,
: 
  href: string;
  children: ReactNode;
) => (
  <a href=href target="_blank">
    children
  </a>
);

export default SafeExternalLink;

【讨论】:

在这种情况下,您仍然应该添加rel="noopener",不是吗? @Shoelaced 我相信 rel="noopener" 在链接您拥有的网页(您信任的网页)时也不是必需的,但无论如何添加它可能会降低任何安全风险。就我而言,我需要避免只使用“noreferrer”。【参考方案6】:

锚标签rel=”noopener”rel=”noreferrer”属性提高了网站的安全性,但有些人想忽略它们,因为他们认为它们会影响他们的网站搜索引擎优化,但这只是一个神话。 它可以保护您网站访问者的机密性,并通过传播恶意代码来防止外部网站。

【讨论】:

如果您能引用一些“神话”声明的来源,那就太好了。特别是对于noreferrer 部分。【参考方案7】:

如果开发人员控制台显示有关 noopener noreferrer 的警告,请确保在 rel 中同时添加 noopenernoreferrer。链接应该如下所示:

<a href="www.google.com" target="_blank" rel="noopener noreferrer" />

【讨论】:

这似乎没有解决所提出的问题。

与 target="_blank" 和 rel="noopener noreferrer" 的链接仍然容易受到攻击?

】与target="_blank"和rel="noopenernoreferrer"的链接仍然容易受到攻击?【英文标题】:Linkwithtarget="_blank"andrel="noopenernoreferrer"stillvulnerable?【发布时间】:2018-11-1512:04:55【问题描述】:我看到有人建议,每... 查看详情

href 到 asd#zxc.txt(文件名包含数字符号)与 IE 的 target="_blank"

】href到asd#zxc.txt(文件名包含数字符号)与IE的target="_blank"【英文标题】:hreftoasd#zxc.txt(filenamecontainsnumbersign)withtarget="_blank"forIE【发布时间】:2011-10-1819:46:14【问题描述】:我需要在href中添加什么以定位到asd#zxc.tx... 查看详情

我可以在 Markdown 中创建带有 'target="_blank"' 的链接吗?

】我可以在Markdown中创建带有\\\'target="_blank"\\\'的链接吗?【英文标题】:CanIcreatelinkswith\'target="_blank"\'inMarkdown?我可以在Markdown中创建带有\'target="_blank"\'的链接吗?【发布时间】:2011-05-2410:28:38【问题描述... 查看详情

如何在 PyQtWebEngine 中使用 target="_blank" 打开超链接?

】如何在PyQtWebEngine中使用target="_blank"打开超链接?【英文标题】:Howtoopenhyperlinkwithtarget="_blank"inPyQtWebEngine?【发布时间】:2021-05-2916:02:58【问题描述】:我已经使用pyqt5和PyQtWebEngine制作了一个Web浏览器。它工作正... 查看详情

Windows 8 应用 WebView 捕获事件 target="_blank"

】Windows8应用WebView捕获事件target="_blank"【英文标题】:Windows8appWebViewcatcheventtarget="_blank"【发布时间】:2014-05-2416:32:08【问题描述】:我想在Windows应用程序上创建一个webview。问题是我不知道如何在使用IE打开窗口... 查看详情

jQuery:使用 target="_blank" 转到 URL

】jQuery:使用target="_blank"转到URL【英文标题】:jQuery:gotoURLwithtarget="_blank"【发布时间】:2011-10-0403:32:00【问题描述】:我正在使用这段jQuery代码来获取链接的href:varurl=$(this).attr(\'href\');--还有这段代码去那个href:... 查看详情

WKWebView 未打开 SOME target="_blank" 链接

】WKWebView未打开SOMEtarget="_blank"链接【英文标题】:WKWebViewnotopeningSOMEtarget="_blank"links【发布时间】:2015-08-1204:10:46【问题描述】:我已经实施了公认的解决方案here,它确实适用于一些网站。例如:访问www.tomcruise.co... 查看详情

不知道如何在代码中使用 target="_blank"

】不知道如何在代码中使用target="_blank"【英文标题】:Don\'tknowhowtousetarget="_blank"incode【发布时间】:2021-01-1613:28:09【问题描述】:我目前使用一个下载按钮,其HTML和Script是这样的<buttonid="downloadbuttonx"onclick="genera... 查看详情

如何仅将 target="_blank" 自动添加到外部链接?

】如何仅将target="_blank"自动添加到外部链接?【英文标题】:Howtoautomaticallyaddtarget="_blank"toexternallinksonly?【发布时间】:2012-08-1600:51:16【问题描述】:我正在构建一个自定义的、特定于行业的cms(使用django)。在... 查看详情

尽管 target="_blank",WordPress 在同一窗口中打开链接

】尽管target="_blank",WordPress在同一窗口中打开链接【英文标题】:WordPressopenslinkinsamewindowdespitetarget="_blank"【发布时间】:2016-02-1507:45:00【问题描述】:在我的页面http://verein-iks.eu/dev/我的右上角有一个Facebook按钮。... 查看详情

在没有 target="_blank" 的新页面中提交表单

】在没有target="_blank"的新页面中提交表单【英文标题】:Submitforminnewpagewithouttarget="_blank"【发布时间】:2013-08-1704:30:57【问题描述】:我有两个提交相同表单的不同按钮。一个提交表单,然后运行数据库查询,另... 查看详情

Android WebView 在添加 WebViewClient 时忽略 target="_blank"

】AndroidWebView在添加WebViewClient时忽略target="_blank"【英文标题】:AndroidWebViewignoringtarget="_blank"whenaddedWebViewClient【发布时间】:2014-11-1919:34:30【问题描述】:我遇到了一个奇怪的问题。在我的应用程序中,我需要从as... 查看详情

为啥 Chrome 的弹出窗口拦截器会在 target="_blank" 的锚标记上调用?

】为啥Chrome的弹出窗口拦截器会在target="_blank"的锚标记上调用?【英文标题】:WhydoesChrome\'spop-upblockerinvokeonananchortagwithtarget="_blank"?为什么Chrome的弹出窗口拦截器会在target="_blank"的锚标记上调用?【发布时... 查看详情

如何在不重新加载的情况下使用 [routerLink] 和 target="_blank" 导航到内部页面?

】如何在不重新加载的情况下使用[routerLink]和target="_blank"导航到内部页面?【英文标题】:HowcanInavigatetoaninternalpageusing[routerLink]andtarget="_blank"withoutreload?【发布时间】:2019-08-2606:51:41【问题描述】:我正在尝试使... 查看详情

Wordpress 主题在链接上阻止 target="_blank"。如何为某些外部链接重新激活它?

】Wordpress主题在链接上阻止target="_blank"。如何为某些外部链接重新激活它?【英文标题】:Wordpressthemeblockstarget="_blank"onlinks.HowdoIreactivateitforsomeexternallinks?【发布时间】:2019-08-1718:16:35【问题描述】:我正在使用这... 查看详情

如何在反应中添加 target=_blank

】如何在反应中添加target=_blank【英文标题】:howtoaddtarget=_blankonreact【发布时间】:2021-01-0807:09:40【问题描述】:我需要使文本中的所有链接打开一个新选项卡,并且文本来自危险的SetInnerHTML=__html:content,。该代码位于一个新类中... 查看详情

如果“target=_blank”,Xamarin Android WebView 不会触发导航

】如果“target=_blank”,XamarinAndroidWebView不会触发导航【英文标题】:XamarinAndroidWebViewdon\'tfirenavigatingif"target=_blank"【发布时间】:2021-12-1716:57:45【问题描述】:我在xamarin中使用webview,我遵循了许多教程来处理导航,并且... 查看详情

ui-router:在新选项卡中打开状态,target="_blank",参数丢失

】ui-router:在新选项卡中打开状态,target="_blank",参数丢失【英文标题】:ui-router:openstateinnewtabwithtarget="_blank",paramsarelost【发布时间】:2016-01-1821:11:29【问题描述】:我正在做一个Angular应用程序,其中每个表格的... 查看详情