浏览器基本原理--> javascript沙箱

711 阅读1分钟

什么是沙箱?

让程序在一个隔离的环境中运行,而不会对主程序或主进程产生影响。

对于 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…