当一个外部链接使用了target=_blank的方式,这个外部链接会打开一个新的浏览器tab。此时,新页面会打开,并且和原始页面占用同一个进程。这也意味着,如果这个新页面有任何性能上的问题,比如有一个很高的加载时间,这也将会影响到原始页面的表现。如果你打开的是一个同域的页面,那么你将可以在新页面访问到原始页面的所有内容,包括document对象(window.opener.document)。如果你打开的是一个跨域的页面,你虽然无法访问到document,但是你依然可以访问到location对象。

如果你在你的站点或者文章中,嵌入了通过新窗口打开一个新页面的链接,这个新页面可以使用window.opener,在一定程度上来修改原始页面

案例:

https://s.codepen.io/adamlaki/debug/dd4475e9a73052ad37d3e5f19f4bcb92

漏洞利用:

通过<a target="_blank" href="http://b.com">打开新窗口,跳转到了b页面,此刻b页面中有一段代码window.opener.location = 'http://c.com'。这是,a页面就会自动跳转到c页面。如果这个c页面是一个和a页面长得一样的钓鱼网站,那么用户可能就中招了。

漏洞解决方案:

在带有target=”_blank”的a标签中,加上rel=”noopener”属性。如果使用window.open的方式打开页面,将opener对象置为空。这样的副作用是:在某些低版本浏览器中,新页面中拿不到referer信息。