安全功能:防止 javascript 关闭窗口

信息安全 网页浏览器 javascript
2021-08-25 02:28:12

大多数网络浏览器的最新版本都实现了一项功能,以防止 javascript 关闭当前窗口或选项卡。

Firefox window.close() 方法

仅允许为使用 window.open() 方法的脚本打开的窗口调用此方法。如果窗口不是由脚本打开的,JavaScript 控制台中会出现以下错误:脚本可能不会关闭不是由脚本打开的窗口。

同样的事情也适用于 Internet Explorer 和 Chrome,但我找不到有关此功能的官方文档以链接到此处。

我的问题是“为什么浏览器会阻止 javascript 关闭当前窗口,除非该窗口是通过脚本本身打开的?这个功能可以防御哪些类型的攻击或滥用案例?”

2个回答

强制执行此限制的原因是 SOP 策略不适用于 window.close(),相反,您实际上可以关闭任何窗口。像往常一样将 SOP 策略应用于 window.close() 是不可能的,浏览器进程中的每个窗口都是相互隔离的,以防止某些跨界攻击,因此即使您的“自己的窗口”也会处于不同的 SOP 中范围。

使用此功能的一个常见过程是在支付过程中,其中网店网站弹出一个支付窗口,然后当网店网站检测到支付完成时,该窗口将关闭。

为了防止滥用此功能来关闭其他站点的窗口,设置了限制,即只能关闭由脚本打开的窗口。

在您想要注销或从页面移走用户的情况下,正常的操作是强制执行不可缓存性,然后使用 window.location.href 将用户移至“注销”页面。

值得注意的是,为了防止遭受 XSS 漏洞的网站被恶意脚本“自动关闭”。虽然脚本打开的页面仍然会遇到这个问题..

有人可能会争辩说“无论如何,任何易受 XSS 攻击的网站都可能被破坏”。

没错,但正如 Matthew 评论的那样,至少您不会“丢失”您的历史记录(只需点击几下即可轻松恢复),并且可能会丢失当前下载(请注意,现代浏览器现在会弹出一个“是你确定要取消下载吗?”消息,但以前不是这样)