js沙箱

沙箱,英文是sandbox,敲程序的应该都听过,或许用过类似理念的只是自己不知道,简单说就是让你的程序运行在一个隔离的环境下,不对外界的其他程序造成影响。沙箱主要是一种安全机制,把一些不信任的代码运行在沙箱之内,不能访问沙箱之外的代码。比如在线编辑器、执行第三方js、vue服务端渲染等,只要是运行不信任的程序,沙箱隔离就会使用到。

常见的eval和new Function可以提供一个运行外部代码的环境,但是没有解决访问全局的问题,配合with用法可以稍微限制,先从当前的with提供的查找,但是查找不到还是能从上获取:

function sandbox(code) {

code= 'with (sandbox) {' + code + '}'

return new Function('sandbox', code)

}

let str = 'let a = 10;console.log(a)'

sandbox(str)({})

可以打印。

而es6的proxy则可以解决这个问题,proxy可以设置访问拦截器,于是with再加上proxy几乎完美解决js沙箱机制。当然,还是有机制可以绕过,有大神发现Symbol.unScopables可以不受with的影响,所以要另外处理Symbol.unScopables:

function sandbox(code) {

code = 'with (sandbox) {' + code + '}';

const fn = new Function('sandbox', code);

return (sandbox) => {

const proxy = new Proxy(sandbox, {

has(target, key) {

return true;

},

get(target, key, receiver) {

if (key === Symbol.unscopables) {

return undefined;

}

}

});

return fn(proxy);

}

}

let str = 'let a = 10;console.log(a)'

sandbox(str)({})

报错。

这是目前js沙箱能做到的最好的沙箱机制了,很多会再加上iframe去做更多的限制,因为H5提出了iframe的sandbox属性,限制了更多,也可以进行配置解决这些限制。当然,想要绕过方法还是有的。而nodejs沙箱就很简单了,直接用内部提供的VM Module就可以了。感兴趣可以自己去查一查。

其实沙箱问题很多,解决修复这些方法也很多,感觉就是一堆大佬在博弈。这边想提一嘴,微前端概念其实就是用js创造一个类似iframe的沙箱,解决隔离问题,分别运行各个项目。所以现在沙箱使用也不一定都是安全机制,也会因为功能需求使用。常见的有快照沙箱和proxy沙箱。

(完)

Coding 个人笔记

本文分享自微信公众号 - coding个人笔记(gh_2ce38b49dae1),作者:coding个人笔记

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 前端路由原理

    对于前端路由应该都很熟悉了,开发过spa应用的应该都用过,只是很少人去查一下前端路由实现的原理。

    wade
  • Vue混入mixins

    混入(mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件...

    wade
  • 数组去重的几个方法

    数组去重很简单,大都运用数组的属性和方法,有很简单的,有复杂的,今天分享几个数组去重的方法。

    wade
  • 微软为什么要用英伟达的GPU来支持CNTK?

    今天下午,在北京举行的GTC CHINA 2016(GPU技术大会)中,英伟达深度学习研究院对CNTK中图像识别功能进行了简单介绍。 首先,我们来了解下CNTK...

    AI科技评论
  • Nodejs进阶:使用DiffieHellman密钥交换算法

    本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 简介 Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用...

    IMWeb前端团队
  • Nodejs进阶:使用DiffieHellman密钥交换算法

    Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥。目前DH最重要的应用场景之一,就是在HTTPS...

    IMWeb前端团队
  • P2261 [CQOI2007]余数求和

    题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值...

    attack
  • MySQL参数

    MySQL依赖大量的参数来控制SQL的处理执行过程。有自己安装过MySQL的小伙伴,对mysql.cnf文件相比很熟悉。这就是mysql默认的参数配置文件,my...

    用户2847900
  • 腾讯云高可用云主机性能提升团队:风口浪尖,淡然处之,也无风雨也无晴

    在一个成长的行业, 不断得有厂商被淘汰,也不断得有黑马进来,情节跌宕起伏,大家争当武林霸主;而身处其中的我们,其实只有最朴实的愿望,把可用性做好,把客户服务好,...

    dandansong
  • BZOJ1008: [HNOI2008]越狱(组合数)

    监狱有连续编号为 1…N1…N 的 NN 个房间,每个房间关押一个犯人,有 MM 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱...

    attack

扫码关注云+社区

领取腾讯云代金券