a标签的target="__blank "和window.opener可以实现恶意跳转?

2019-09-19771次阅读其它

如果当前窗口是由另一个窗口(例如:通过window.open方式或者a标签中的target="_blank"属性)打开的, window.opener保留了那个窗口window对象的引用。 如果当前窗口不是由其他窗口打开的, 则该属性返回null。

为什么说window.opener可以实现恶意跳转?

例如:当带有target="_blank"的a标签打开的新标签页面可以通过window.opener.location=来将来源页面跳转到钓鱼页面。又或者说当点击友情链接新开窗口进入他的网站后,他的网页可以利用window.opener.location.href="他的网址" 把你的网页也跳转到他的网站内的页面(当然也可以是其他页面)。这就相当于你好心借钱给别人,但到最后你的全部身家都被他占了去!

// 本地页面
<html lang="en">
<body>
  <a href="http://www.baidu.com" target="_blank">http://www.baidu.com</a>
</body>
</html>

// b.com下的页面
<html lang="en">
<body>
  <script type="text/javascript">
    if (opener) {
      opener.window.location.href="http://www.xinran001.com";
    }
  </script>
</body>
</html>

给a标签增加rel=noopener或者是rel=noreferrer可以阻止这一行为

noopener是最合适的属性,不过noreferrer同样也包含有noopener的功效,noreferrer、noopener同时加是多余的。
rel="opener" 是功能恰好相反的选项,因为其实除了Chrome,最新版的Safari和Firefox已经都为a链接默认采用noopener模式了,真需要opener属性的时候可以使用rel="opener"开启。

也可以组合使用rel="external nofollow noopener noreferrer"

rel = 'nofollow' 的作用是:它是来告诉搜索引擎,不要将该链接计入权重,因为在很多情况下,我们可以将一些不想传递权重的链接进行nofollow处理,比如一些非本站的链接,不想传递权重,但是又需要加在页面中,比如一些 统计代码,备案号链接,供用户查询链接等等这些。

rel = 'external' 的作用是:它告诉搜索引擎,这个链接不是本站链接。

rel = 'noopener' 的作用是:确保window.opener为null。

rel = 'noreferrer​​​​​​​​​​​​​​' 的作用是:禁用HTTP头部的Referer(来源)属性。

上一篇: 关于箭头函数的一些说法  下一篇: js中onkeydown回车触发事件的几种方法  

a标签的target="__blank "和window.opener可以实现恶意跳转?相关文章