工作中,经常在<a>标签中添加target="_blank",用来在新窗口打开页面,尤其是打开外链应用率几乎是100%。可是最近看到这竟然有一个巨大的安全隐患:
比如在index.html中跳转到index2.html
<a href="index2.html" target="_blank">link</a>
在index2.html中添加一段js代码
<script type="text/javascript">
window.opener.location.href ="http://www.baidu.com"
</script>
此时会发现,index.html已经跳转的百度了。原因是:当站点在链接中使用target="_blank"来打开新标签页或窗口时,该站点就通过window.opener API给了新页面对原有窗口的访问入口,并授予了一些权限。这其中的一些权限被跨域限制拦截了,但是window.location是漏网之鱼。如果,上述链接是钓鱼网站,那就非常可怕了!
这个问题的解决方法就是:在使用target="_blank"时,加上rel="noopener",此时window.opener 已经被置为了 null。
有资料说:rel="noopener"不支持火狐浏览器,需要加上rel="norefferrer",可是我测试是支持的。又有说法是rel="norefferrer"是为了支持旧的浏览器,但我用的IE8,不论是rel="noopener"还是rel="norefferrer"都没有效果,这让我好尴尬……还有,我测试的:不论是谷歌浏览器还是火狐浏览器,既支持rel="noopener"也支持rel="norefferrer"。(低版本浏览器应该是指谷歌低版本,这个安全漏洞在IE浏览器该如何解决呢?)
在使用window.open()也会出现同样的安全漏洞,此需要用js将opener置为null。
var newOpen = window.open();
newOpen.opener = null;
newOpen.location = "http://www.baidu.com";