js实现js沙盒
使用 iframe 实现沙盒隔离
通过 iframe 可以创建一个独立的执行环境,与主页面隔离。
const iframe = document.createElement('iframe');
iframe.sandbox = 'allow-scripts'; // 限制 iframe 的能力
document.body.appendChild(iframe);
const sandboxedScript = iframe.contentWindow.eval;
sandboxedScript('console.log("运行在沙盒中")');
iframe 的 sandbox 属性可以限制各种能力,如不允许访问父页面 DOM、不允许弹出窗口等。
利用 Proxy 限制对象访问
通过 Proxy 可以拦截对对象的访问,实现安全控制。

const sandbox = (code) => {
const scope = new Proxy(window, {
has() { return true },
get(target, prop) {
if (['eval', 'Function'].includes(prop)) {
throw new Error(`禁止访问 ${prop}`);
}
return target[prop];
}
});
with(scope) { eval(code); }
};
sandbox('console.log("安全的执行环境")');
这种方法可以限制对危险 API 的访问,但需要小心 with 语句的使用。
使用 Web Workers 隔离执行
Web Workers 运行在独立线程中,有自己独立的作用域。

const workerCode = `
self.onmessage = function(e) {
try {
const result = eval(e.data);
postMessage({success: true, result});
} catch (err) {
postMessage({success: false, error: err.message});
}
}
`;
const blob = new Blob([workerCode], {type: 'application/javascript'});
const worker = new Worker(URL.createObjectURL(blob));
worker.onmessage = (e) => {
if (e.data.success) {
console.log('执行结果:', e.data.result);
} else {
console.error('执行出错:', e.data.error);
}
};
worker.postMessage('1 + 1');
Web Workers 提供了良好的隔离性,但无法访问 DOM。
利用 ShadowRealm 提案
ShadowRealm 是一个新的 JavaScript 提案,专门用于创建隔离的执行环境。
const realm = new ShadowRealm();
const result = realm.evaluate('1 + 2');
console.log(result); // 3
// 调用沙盒中的函数
const add = realm.evaluate('(a, b) => a + b');
console.log(add(1, 2)); // 3
ShadowRealm 提供了最接近语言级别的沙盒支持,但目前浏览器支持有限。
注意事项
- 沙盒逃逸是常见的安全问题,需要全面测试
- 性能开销需要考虑,特别是频繁执行的代码
- 不同方案适用于不同场景,根据需要选择
- 永远不要信任用户输入的代码
每种方法都有其优缺点,实际应用中可能需要组合多种技术来实现更安全的沙盒环境。






