rel=noopener标签虽小,可能对不懂开发的很多人来说对noopener标签了解的不很多,但他在维护window.opener的安全上有重大作用。
window.opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用。例如: window.opener.close()将关闭源(父)窗口。但a链接需要有 target="_blank"才会有这个问题。因为没有target="_blank"就不存在源(父)窗口。
关于window.opener
window.opener 表示打开当前窗体页面的的父窗体是谁。
例如,在 A 页面中,通过一个带有 target="_blank" 的 a 标签打开了一个新的页面 B,那么在 B 页面里,window.opener 的值为 A 页面的 window 对象。
无来源的打开的页面,或者被禁止了 opener 的页面创建/打开,opener 的值为 null。
一般来说,打开同源(相同)的页面,不会有什么问题。但对于跨域的外部链接来说,存在一个安全上的风险。
在跨域的情况下,window.opener 拿不到来源页面的具体内容,但是 window.opener.location 却是例外。它会带来什么问题呢?
举个栗子:
假如你在百度首页添加了一个链接(例如: https://www.56dr.com/ https://www.56dr.com/
如果没有对这个主页链接设置禁用 window.opener 的跟踪,在打开的 https://www.56dr.com/ 页面,可以通过 window.opener.location 改写来源站点的地址。利用这一点,将来源站点改写到钓鱼站点页面上,例如跳转到伪造的百度登陆页面,那么粗心的用户很难发现这一变化,那么他的账号就存在偷走的可能了。
因为如前面所讲,在新打开的页面(baidu)中可以通过window.opener获取到源页面的部分控制权,即使新打开的页面是跨域的也照样可以(例如 location 就不存在跨域问题),
那么你就让用户暴露在一个非常简单的危险境地。
第三方可以通过window.opener来操作源页面,会有很大的安全隐患,比如:
if (window.opener) {
window.opener.location = "**网站地址**?referrer=" document.referrer;
}
复制代码第三方网站就可以更改源页面的地址源,你本来浏览的是自己的网站,点击了这个链接后,第三方的一个操作,你的页面就变成了第三方给你设置的网站了,就如上边举得那个栗子。
所以为了限制 window.opener的访问行为,为了安全起见,原始页面需要在每个使用了target="_blank"的链接中加上一个rel="noopener"属性,规定禁止新页面传递 rel=noopener,通过设置了此属性的链接打开的页面,其 window.opener 的值为 null。但该属性在 chrome 49 ,Opera 36 版本中才得到支持。在不支持 rel=noopener 属性的浏览器中,可以使用 rel=noreferrer 禁用 HTTP 头部的 Referer 属性跟踪来源页面,得到的效果一样。
这样网站会阻止不法者者获取有关链接源和与 referrer 链接相关的任何数据的信息。可以有效的防止打开的子页面操控源页面跳转到另一个相似的违法网站,提高网站安全性。
来源链接:https://www.xinnet.com/knowledge/1603272712.html
本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。
免责声明:本站发布的内容(图片、视频和文字)以原创、来自本网站内容采集于网络互联网转载等其它媒体和分享为主,内容观点不代表本网站立场,如侵犯了原作者的版权,请告知一经查实,将立刻删除涉嫌侵权内容,联系我们QQ:712375056,同时欢迎投稿传递力量。
Copyright © 2009-2022 56dr.com. All Rights Reserved. 特网科技 特网云 版权所有 特网科技 粤ICP备16109289号
域名注册服务机构:阿里云计算有限公司(万网) 域名服务机构:烟台帝思普网络科技有限公司(DNSPod) CDN服务:阿里云计算有限公司 百度云 中国互联网举报中心 增值电信业务经营许可证B2
建议您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流浏览器浏览本网站