window.open之浏览器新窗口打开
# 安全隐患问题
如果只是加上 target="_blank"
,打开新窗口后,新页面能通过 window.opener
获取到来源页面的 window 对象,即使跨域也一样。虽然跨域的页面对于这个对象的属性访问有所限制,但还是有漏网之鱼。例如:如果你处于登录状态,有些操作可能只是发送一个GET请求就完事了。通过修改地址,就执行了非你本意的操作,其实就是 CSRF 攻击。
# 性能问题
如果通过 target="_blank"
打开的新窗口,跟原来的页面窗口共用一个进程。如果这个新页面执行了一大堆性能不好的 JavaScript 代码,占用了大量系统资源,那你原来的页面也会受到池鱼之殃。
# 解决方案
尽量不使用 target="_blank"
,如果一定要用,需要加上 rel="noopener"
或者 rel="noreferrer"
。这样新窗口的 window.openner
就是null了,而且会让新窗口运行在独立的进程里,不会拖累原来页面的进程。不过,有些浏览器对性能做了优化,即使不加这个属性,新窗口也会在独立进程打开。不过为了安全考虑,还是加上吧。
通过 a 标签的方式打开的新页面,可以这样做:
<a href="https://www.baidu.com" target="_blank" rel="noopener">demo</a>
1
另外,对于通过 window.open 的方式打开的新页面,可以这样做:
let win = window.open();
win.opener = null;
win.location = "https://www.baidu.com";
win.target = "_blank";
1
2
3
4
2
3
4
上次更新: 2024/01/30, 00:35:17
- 01
- linux 在没有 sudo 权限下安装 Ollama 框架12-23
- 02
- Express 与 vue3 使用 sse 实现消息推送(长连接)12-20