什么是沙箱?
让程序在一个隔离的环境中运行,而不会对主程序或主进程产生影响。
对于 JavaScript 来说,沙箱并非传统意义上的沙箱,它只是一种语法上的 Hack 写法,沙箱是一种安全机制,把一些不信任的代码运行在沙箱之内。
沙箱能做什么?
-
实现JS在线编辑器:可以把用户输入的代码放到沙箱中运行,以免用户输入的信息影响页面的运行。 -
服务端渲染:例如在vue服务端渲染时,服务端会利用node中的vm创建一个沙箱,将前端的bundle代码放入沙箱中运行,以免影响node服务的正常运行。 -
vue模板中表达式计算:vue模板中表达式的计算被放在沙盒中,只能访问全局变量的一个白名单,如 Math 和 Date 。你不能够在模板表达式中试图访问用户定义的全局变量。
怎样实现js沙箱
闭包--IIFE立即执行表达式
(function() {
// 在这其中运行的代码不会影响到外面
})()
模拟浏览器对象
### eval
```css
var b = eval("({name:'张三'})")
console.log(b.name);
```
eval 执行的代码可以访问闭包和全局范围,会创建封闭的全局作用域。
new Function
with
with + new Function
基于 Proxy 实现的沙箱(ProxySandbox)
function sandbox(code) {
code = 'with (sandbox) {' + code + '}'
const fn = new Function('sandbox', code)
return function (sandbox) {
const sandboxProxy = new Proxy(sandbox, {
has(target, key) {
return true
}
})
return fn(sandboxProxy)
}
}
var a = 1;
var code = 'console.log(a)' // TypeError: Cannot read property 'log' of undefined
sandbox(code)({})
参考文章 JavaScript 沙盒模式 juejin.cn/post/697682…