Object.create(null) 搭配 Proxy 是构建轻量级前端沙箱最直接有效的方式:创建无原型基座实现纯净继承,手动挂载安全能力,子沙箱自动继承只读属性且写入隔离,Proxy 拦截 get/set/has/ownKeys 确保访问控制与敏感 API 屏蔽,并绑定执行上下文、禁用 with、按需注入受控能力。

用 Object.create(null) 搭配原型链继承,是构建轻量级前端沙箱上下文隔离最直接有效的方式。它不依赖 iframe 或 Web Worker,也不需要完整重写全局对象,核心在于“只读继承 + 自身写入”,天然支持父子沙箱状态复用与隔离。
用 Object.create(null) 创建纯净无原型基座
真实 window 对象自带大量原型方法(如 toString、hasOwnProperty),容易被恶意代码利用或意外触发副作用。用 Object.create(null) 创建的空对象没有原型链,彻底切断隐式继承:
- 父沙箱 =
Object.create(null),然后手动挂载安全能力:如sandbox.console = { log() { ... } }、sandbox.Date = { now: Date.now } - 子沙箱 =
Object.create(父沙箱),自动继承所有只读属性,但自身修改不会影响父级 - 所有新增变量(如
sandbox.a = 1)都落在子沙箱自身,读取时才沿原型链向上查找
配合 Proxy 实现写入拦截与敏感属性屏蔽
仅靠原型链不能阻止向父级写入(比如误用 parentSandbox.x = 1),也不能过滤危险 API。必须用 Proxy 封装子沙箱对象:
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
-
get拦截:先查自身,再查原型链;对eval、document、location等一律返回undefined或抛错 -
set拦截:强制receiver === target,禁止向原型链赋值,确保所有写操作仅作用于当前子沙箱 -
has和ownKeys拦截:隐藏原型上不可枚举属性,避免被for...in或Object.keys暴露
绑定执行上下文,杜绝隐式 this 逃逸
子应用脚本若直接执行,this 可能指向真实 window 或 globalThis,破坏隔离。需显式绑定沙箱对象:
立即学习“前端免费学习笔记(深入)”;
- 用
new Function('sandbox', 'return (function(){' + code + '}).call(sandbox)')包装代码 - 调用时传入 Proxy 封装后的子沙箱对象:
fn(sandboxProxy) - 禁用
with语句:在执行前做 AST 检测或正则扫描,拒绝含with的代码片段
按需注入受控能力,而非暴露原始全局
继承 ≠ 安全。Math、Date、fetch 等原生对象若整块挂载,仍可能带来副作用或信息泄露:
- 时间:只提供
sandbox.Date = { now: () => Date.now() },不暴露Date.parse或构造器 - 随机数:用
sandbox.Math = { random: Math.random },避免Math.sin等非必要方法 - 网络:封装
sandbox.fetch = (url, opts) => realFetch(url, { ...opts, headers: { ... } }),统一加鉴权头 - DOM 模拟:若需 document,必须是完整 Proxy 对象,所有属性(包括
cookie、body)都走拦截逻辑

















