Node.js 沙箱环境

本文探讨了Node.js的vm模块如何创建沙箱环境执行代码,以实现上下文隔离。通过示例展示了runInNewContext、runInThisContext和runInContext等方法的用法,并讨论了超时控制、错误捕获和延迟执行。同时,文章指出尽管vm比eval更安全,但仍然不适用于执行不信任的代码,推荐使用物理隔离如Docker。
摘要由CSDN通过智能技术生成

node官方文档里提到node的vm模块可以用来做沙箱环境执行代码,对代码的上下文环境做隔离。

\A common use case is to run the code in a sandboxed environment. The sandboxed code uses a different V8 Context, meaning that it has a different global object than the rest of the code.

先看一个例子

const vm = require('vm');
let a = 1;
var result = vm.runInNewContext('var b = 2; a = 3; a + b;', {a});
console.log(result);// 5
console.log(a); // 1
console.log(typeof b);// undefined 

沙箱环境中执行的代码对于外部代码没有产生任何影响,无论是新声明的变量b,还是重新赋值的变量a。 注意最后一行的代码默认会被加上return关键字,因此无需手动添加,一旦添加的话不会静默忽略,而是执行报错。

const vm = require('vm');
let a = 1;
var result = vm.runInNewContext('var b = 2; a = 3; return a + b;', {a});
console.log(result);
console.log(a);
console.log(typeof b); 

如下所示

evalmachine.<anonymous>:1
var b = 2; a = 3; return a + b;^^^^^^

SyntaxError: Illegal return statementat new Script (vm.js:74:7)at createScript (vm.js:246:10)at Object.runInNewContext (vm.js:291:10)at Object.<anonymous> (/Users/xiji/workspace/learn/script.js:3:17)at Module._compile (internal/modules/cjs/loader.js:678:30)at Object.Module._extensions..js (internal/modules/cjs/loader.js:689:10)at Module.load (internal/modules/cjs/loader.js:589:32)at tryModuleLoad (internal/modules/cjs/loader.js:528:12)at Function.Module._load (internal/modules/cjs/loader
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值