Mac*_*ity 20 javascript cross-domain
过了一会儿,我遇到了一个有趣的安全漏洞
<a href="http://someurl.here" target="_blank">Link</a>
Run Code Online (Sandbox Code Playgroud)
看起来很无害,但是有一个漏洞,因为默认情况下,正在打开的页面允许打开的页面通过它回调它window.opener.有一些限制,是跨域的,但仍然有一些可以做的恶作剧
window.opener.location = 'http://gotcha.badstuff';
Run Code Online (Sandbox Code Playgroud)
现在,HTML有一个解决方法
<a href="http://someurl.here" target="_blank" rel="noopener noreferrer">Link</a>
Run Code Online (Sandbox Code Playgroud)
这可以防止新窗口window.opener传递给它.这对HTML很好,但是如果你使用的话window.open怎么办?
<button type="button" onclick="window.open('http://someurl.here', '_blank');">
Click Me
</button>
Run Code Online (Sandbox Code Playgroud)
你会如何阻止window.opener被传递到这里?
G0B*_*LiN 26
该window.open()呼叫现在支持 "noopener"功能.
所以调用window.open('https://www.your.url','_blank','noopener') 应该打开一个null的新窗口/选项卡window.opener.
我无法找到支持浏览器(和版本)的可靠列表 - MDN 在此声明
现代浏览器支持此功能,包括Chrome和Firefox 52+.
从我的实验中,我发现它适用于:
但不起作用:
(在运行Windows 10的PC上进行的所有测试......)
为了向后兼容,最好将它与t3__rry的答案结合起来.
t3_*_*rry 21
使用
var yourWindow = window.open();
yourWindow.opener = null;
yourWindow.location = "http://someurl.here";
Run Code Online (Sandbox Code Playgroud)
感谢Mathias Bynens:https://mathiasbynens.github.io/rel-noopener/
I.G*_*ual 19
指出它是逗号分隔的功能列表(没有空格),因此您可以设置'noopener,noreferrer,resizable'ie:
window.open('http://sensible.url', '_blank', 'noopener,noreferrer,resizable')
Run Code Online (Sandbox Code Playgroud)
来自Mozilla 文档:
windowFeatures选修的一个 DOMString,包含以逗号分隔的窗口功能列表,并以“name=value”的形式给出相应的值。[...]
根据文档(https://developer.mozilla.org/en/docs/Web/API/Window/open),在以下代码中
window.open('https://www.your.url','_blank','noopener')
Run Code Online (Sandbox Code Playgroud)
第三个参数包含“WindowFeatures”(参见https://developer.mozilla.org/en-US/docs/Web/API/Window/open#Window_features)所以它在新窗口中打开目标是有意义的
这对我有用:
const a = document.createElement("a")
a.href = args.url
a.target = "_blank"
a.rel = "noopener"
a.click()
Run Code Online (Sandbox Code Playgroud)