rel=noopener 了解下
在浏览器中,通过 <a target='blank'>
或 window.open()
函数可以打开新页面。新打开的子页面中的 window 对象中会有一个 opener
属性,保留对父页面的引用。 子页面可以通过该属性,访问父页面 window 属性中的属性和方法。同域情况下,可以访问父页面 window 属性中的所有属性和方法,跨域情况下只能访问 location
、postMessage()
等。
1 | // A.html |
很显然,上面两种打开新页面的方式存在钓鱼的可能性:通过父页面中的链接打开子页面后,子页面通过 opener.location
将父页面跳转到高仿的钓鱼页。
为了规避这种风险,HTML5 规范对 rel
属性新增了 noopener
值。通过设置了 noopener
属性的 <a rel='noopener'>
标签打开新页面,新的子页面不会保留对父页面的引用,它的 opener
属性为 null
。有点遗憾的是,只有部分浏览器支持 noopener
属性。
1 | <a href="./b.html" target="_blank" rel="noopener">noopener</a> |
通过 window.open()
函数打开新页面,可以手动将新页面的 opener
置为 null
。
1 | const _sub = window.open('./b.html'); |