微前端沙箱需代理全局对象并重绑定内置构造函数上下文,通过 fakewindow + proxy 拦截 object.keys 等调用,冻结原型链、拦截 prototype 修改,避免污染主应用;qiankun 等方案已成熟实现。

在微前端沙箱中,JavaScript 对象 API(如 Object、Array、Date、JSON 等)本身是全局构造函数,它们的原型方法(如 Object.keys、Array.prototype.map)默认绑定到宿主环境的全局对象。若不加隔离,子应用直接调用这些 API 仍会访问或污染主应用的全局状态(例如修改 Array.prototype.push),破坏沙箱安全性。
核心思路:代理全局对象 + 重绑定内置构造函数的 this
不能只代理 window,还要确保子应用执行时所有内置对象 API 的上下文指向沙箱内的“纯净”全局对象(即一个干净的 fakeWindow)。关键在于:让子应用代码中对 Object.keys、JSON.parse 等的调用,实际运行在沙箱上下文中,而非原始 window。
- 创建一个空的代理对象
fakeWindow,作为子应用的全局对象(this和window指向它) - 将原生构造函数(
Object、Array、JSON等)以属性形式挂载到fakeWindow上,但需确保其内部方法调用时的this或隐式绑定仍安全 - 使用
Proxy拦截fakeWindow的读取(get),对内置对象属性返回「绑定过上下文」的版本(例如返回Object.keys.bind(fakeWindow.Object)) - 对非构造函数属性(如
location、fetch)也做类似代理,避免直接暴露宿主真实对象
为什么不能只用 with 或 eval?
with 已被严格模式禁用,且无法控制原型链和构造函数行为;eval 执行代码时仍共享顶层作用域,无法切断对原生 Object 等的直接引用。真正有效的做法是:在子应用 JS 执行前,通过 AST 分析或运行时重写,将所有全局标识符(如 Object、JSON)替换为 fakeWindow.Object,再配合 Proxy 拦截保证行为一致。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 主流方案(如 qiankun)采用
patch+Proxy组合:先用Function构造器动态生成沙箱执行函数,将其this绑定到fakeWindow - 对
Object等构造函数自身不做代理(它们是函数对象,不可全量代理),而是劫持其静态方法和原型方法的调用上下文 - 例如:
fakeWindow.Object = new Proxy(Object, { apply: (target, thisArg, args) => new target(...args) }),确保new Object()创建的对象原型链仍指向沙箱内Object.prototype
属性分配隔离的关键:拦截 defineProperty / setPrototypeOf / prototype 修改
子应用可能尝试篡改 Object.prototype 或给 Array.prototype 添加方法,这会污染全局。必须拦截所有可能影响原型链的操作:
- 用
Proxy包裹fakeWindow.Object,在set或defineProperty中拒绝修改prototype属性 - 重写
fakeWindow.Object.setPrototypeOf,对非沙箱内对象的原型设置抛出错误或静默忽略 - 冻结关键原型对象:
Object.freeze(fakeWindow.Object.prototype)、Object.freeze(fakeWindow.Array.prototype)(注意:仅对沙箱内实例有效,不影响宿主) - 对
__proto__赋值操作,在set拦截器中识别并阻止
实际落地建议:优先复用成熟沙箱方案
手写完整对象 API 隔离极其复杂(涉及 Symbol、TypedArray、Promise、Proxy 自身等边界情况)。生产环境推荐:
- 使用 qiankun 的
proxySandbox(基于Proxy实现,已处理大部分内置对象 API 的上下文绑定与原型防护) - 若需轻量方案,可基于 import-html-entry + 自定义
fakeWindow+Function执行,并对Object、Array、JSON、Date、RegExp显式绑定(如fakeWindow.JSON = JSON,再代理其方法) - 务必测试子应用是否依赖
document.currentScript、Function.prototype.toString等易被代理干扰的 API,并做针对性兼容
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










