HTMLa标签打开新标签页避免出现安全漏洞,请使
⽤“noopener”
新标签页中打开⼀个⽹址如何出现安全漏洞
让我们在⽹站上的新标签页中打开⼀个⽹址,html如下
<a href="malicious-domainlify" target="_blank">
访问恶意⽹站!
</a>
这⾥我们有⼀个指向恶意⽹站的 href 属性,并以 _blank 属性为 target,使其在新标签页中打开。
该流程看起来如此简单明了,⽤户在这⾥可能⾯临的安全风险是什么?
⽤户从你的页⾯重定向到域,此时,浏览器会将你当前⽹站的所有 window 变量内容附加到恶意⽹站的 window.opener 变量。现在恶意⽹站可以访问你⽹站的 window,这显然在重定向此⽅法时打开了⼀个安全漏洞。
恶意⽹站⼀旦通过 window.opener 访问了你的⽹站的 window 变量,它可以将你之前的⽹站重定向到⼀个新的钓鱼⽹站,这个⽹站可能与你打开的实际⽹站相似,甚⾄可能会要求你再次登录。
在恶意⽹站中,只需编写以下代码即可完成上述修改
if (window.opener) {
window.opener.location = 'www.dhilipkmr.dev';
}
因此,⽆辜⽤户将陷⼊此陷阱,并提供可能暴露给攻击者的登录详细信息。
我们如何避免这种情况?
⼀种简单的⽅法是将带有 noopener 的 rel 属性添加到 <a> 标记。
<a href="malicious-domainlify" rel="noopener" target="_blank">
访问恶意⽹站!
href标签怎么用</a>
它有什么作⽤?
rel = "noopener" 表⽰浏览器不要将当前⽹站的 window 变量附加到新打开的恶意⽹站。
这使得恶意⽹站的 window.opener 的值为 null。
因此,在将⽤户导航到你未维护的新域时,请当⼼。
并⾮总是我们⽤标签打开⼀个新标签,在某些情况下,你必须通过执⾏JavaScript的 window.open() 来打开它,如下所⽰:
function openInNewTab() {
// ⼀些代码
window.open('malicious-domainlify');
}
<span class="link" onclick="openInNewTab()">访问恶意⽹站!</span>
这⾥没有提及 noopener,因此这导致当前⽹站的 window 传递到恶意⽹站。
通过js打开新标签页时,该如何处理?
function openInNewTabWithoutOpener() {
var newTab = window.open();
newTab.opener = null;
newTab.location='malicious-domainlify';
}
<span class="link" onclick="openInNewTabWithoutOpener()">访问恶意⽹站!</span>
我们已经通过 window.open() 打开了⼀个虚拟标签,该标签打开了 about:blank,因此这意味着它尚未重定向到恶意⽹站。
然后,我们将新标签的 opener 值修改为 null。
将我们将新标签的⽹址修改为恶意⽹站的⽹址。
这次,opener 再次为空,因此它⽆法访问第⼀个⽹站的 window 变量。
问题解决了。
但是在旧版本的Safari中将⽆法使⽤此⽅法,因此我们再次遇到问题。
如何解决Safari的问题?
function openInNewTabWithNoopener() {
const aTag = ateElement('a');
aTag.target = "_blank";
aTag.href = 'malicious-domainlify';
aTag.click();
}
<span class="link" onclick="openInNewTabWithoutOpener()">访问恶意⽹站!</span>
在这⾥,我们模拟点击锚标记。
我们创建 <a> 标记并分配所需的属性,然后在其上执⾏ click(),其⾏为与单击链接相同。
不要忘记在此处向标签添加 rel 属性。
其他事实:
当您在锚标记上单击 CMD + LINK 时,Chrome,Firefox和Safari会将恶意⽹站的 window.opener 视为 null。
但是,在通过JavaScript处理新标签页打开的元素上的 CMD + LINK 上,浏览器将附加窗⼝变量并将其发送到新标签页。
默认情况下,新版的Safari会在所有情况下删除 window.opener,要将窗⼝信息传递给新的标签页,你必须明确指定 rel='opener'。没有⼈可以绕过你的"保安"。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。