基于浏览器沙箱隔离实现iframe微前端策略
前记
看过我前面几篇文章的同学可能意识到了,我的最近的文章选型一直是“前端中的多线程”,因为在实习公司的缘故,这个部门一直是基于微前端框架进行开发的,这难免耳濡目染,也激发了我对微前端领域的探索,也对常见的实现微前端的策略进行学习而写下这篇学习记录,那么我们开始吧。
浏览器的进程们
这边会侧重的说明两个进程:1、浏览器主进程 2、渲染进程
浏览器主进程
也被称为浏览器引擎进程或浏览器核心进程,是浏览器的核心组件,负责管理和协调浏览器的各种功能和进程:
- 用户界面管理:地址栏、标签页、菜单栏
- 网络请求处理:处理用户发起的网络请求,并负责与服务器进行通信。管理网络链接、发送和接收数据、处理各种网络协议
- 进程管理:会派生进程并监督它们的活动情况,浏览器主进程会对派生的进程进行沙箱隔离、具备沙箱策略引擎服务。浏览器主进程通过内部的I/O进程与其他进程通信,通信的方式是
IPC & Mojo
还有其他功能,这边就不做赘述了哈。
渲染进程
主要负责标签页和 iframe 所在web应用的UI渲染和js执行。渲染进程由浏览器主进程进行派生,每次手动新开标签页时,浏览器进程会创建一个新的渲染进程。
浏览器沙箱隔离
概念
浏览器沙箱隔离是一种安全机制,用于在浏览器中隔离和限制不受信任的代码或内容的访问权限和行为。它的目的是保护用户的计算设备和数据免受恶意代码的攻击或滥用。
浏览器沙箱隔离可以实现以下功能:
-
代码隔离:沙箱隔离可以将不同的代码运行环境隔离开来,防止恶意代码对系统和其他代码的不良影响。例如,沙箱可以将浏览器中的JavaScript代码与操作系统的底层功能隔离开来。
-
权限限制:沙箱隔离可以限制不受信任的代码对系统资源的访问权限。例如,沙箱可以限制代码对文件系统、网络、摄像头等敏感资源的访问。
-
网络隔离:沙箱隔离可以阻止恶意代码通过网络进行攻击或滥用。例如,沙箱可以限制代码对其他域的跨域请求,防止跨站点脚本攻击(XSS)和跨站请求伪造(CSRF)等安全问题。
-
数据隔离:沙箱隔离可以保护用户的个人数据和敏感信息。例如,沙箱可以限制代码对浏览器缓存、Cookie、本地存储等数据的访问。
浏览器沙箱隔离通常由浏览器厂商实现,并结合其他安全机制(如同源策略、CSP等)来提供全面的安全保护。不同的浏览器可能采用不同的沙箱隔离实现方式,如进程隔离、沙箱扩展等。这些机制共同工作,以确保用户的浏览器环境安全可靠。
沙箱隔离中的处理
浏览器在进行沙箱设计时,会尽可能的复现现有操作系统的沙箱技术,所有的沙箱都会在进程粒度进行控制,所有的进程都通过IPC进行通信。在浏览器沙箱的架构中,存在一个浏览器主线程和多个渲染进程,浏览器主线程主要用于派生渲染进程、管理渲染进程的沙箱策略,代理渲染进程执行策略允许的操作,主要运行不受信任的三方web应用,因此,在Renderer进程中的一些系统操作需要经过IPC通知浏览器进程进行代理操作。例如网络访问、文件访问、用户输入输出的访问等。
旧时代与新时代的iframe
旧时代
浏览器中的沙箱隔离是以渲染进程为单位,而在旧版的浏览器中会存在多个web应用共享同一个渲染进程的情况,而在旧时代的浏览器中会依靠同源策略来限制两个不同源的文档进行交互。
当在一个web应用中使用多个iframe应用,而都处于同一个渲染进程,web应用有肯呢个发现安全漏洞并绕过同源策略的限制,访问同一个进程中的其他web应用,因此可能产生风险:
- 跨站点获取web应用的cookie、html5、xml、json数据
- 获取浏览器的保存的私密数据
- 跨站点获取web应用权限
- 跨站点获取web应用的dom元素
新时代
在现在的像上面的这种用法中,多个iframe应用在同一个进程中,每个iframe应用都有一层沙箱隔离进行处理,可以基于沙箱策略进行应用的进程隔离,确保攻击者难以绕过安全漏洞直接访问跨站 Web 应用。