沙箱,即 sandbox,顾名思义,就是让你的程序跑在一个隔离的环境下,不对外界的其他程序造成影响,通过创建类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。
使用场景
- 解析或执行不可信的
JS - 隔离被执行代码的执行环境
- 对执行代码中可访问对象进行限制
实现方式
with + new Function
在 with 的块级作用域下,变量访问会优先查找你传入的参数对象,之后再往上找,所以相当于你变相监控到了代码中的“变量访问”,结合 proxy 代理可以监听所有数据的修改和访问
1 | function proxyFanctory(obj) { |
需要解决的问题
proxy无法监听深层次数据的访问,可以通过访问原型链的方式,实现沙箱逃逸(代码分析)window等固有对象调用(iframe创建隔离的上下文)
借助 iframe 实现
sandbox 是 h5 的提出的一个新属性, 启用方式就是在 iframe 标签中使用 sandbox 属性
1 | <iframe sandbox src="url"></iframe> |
限制
script脚本不能执行,allow-scripts属性- 不能发送
ajax请求,allow-same-origin允许同域请求
具体参考 iframe
Web Worker
Web Worker 子线程的形式也是一种天然的沙箱隔离
限制
- 出于线程安全设计考虑,
Web Worker不支持DOM操作,必须通过postMessage通知UI主线程来实现。 Web Worker无法访问window、document之类的浏览器全局对象。
通过代理将具体的渲染实现再转发给原 WorkerDomNodeImpl.js 逻辑来实现 DOM 的实际更新。