当前位置: 首页 > 后端技术 > Node.js

Node核心模块-vm

时间:2023-04-03 13:58:12 Node.js

vmvm是node的一个核心模块。官方文档对核心功能的介绍是:vm模块提供了在V8虚拟机上下文中编译和运行代码的API。vm模块不是安全机制。不要用它来运行不受信任的代码。这些文档中使用的术语“沙箱”只是指一个单独的上下文,并不提供任何安全保证。意思是:vm可以使用v8的VirtualMachinecontext来动态编译和执行代码,代码的执行上下文与当前进程隔离,但这里的隔离并不是绝对安全的,也不完全等同于沙盒环境的浏览器。示例vm的使用非常简单,这里有几个示例:vm.runInNewContextconstvm=require('vm');constsandbox={a:1};//在新上下文中运行constresult=vm.runInNewContext('a+=1',sandbox);console.log(result);//2console.log(sandbox);//{a:2}vm.runInContextconstvm=require('vm');constsandbox={a:1};//https://nodejs.org/api/vm.html#vm_what_does_it_mean_to_contextify_an_objectvm.createContext(sandbox);//在执行上下文中运行constresult=vm.runInContext('a+=1',沙箱);控制台。log(result);//2console.log(sandbox);//{a:2}vm.runInThisContextconstvm=require('vm');global.a=1;//Runvm.runInThisContext('inthecurrentcontexta+=1');console.log(global.a);//2个使用场景我个人理解vm有2个使用场景:环境隔离:由于node的js代码是单线程的,在并发场景下,需要考虑context的竞争和相互影响,直接使用vm以最小的代价解决这个问题。在vuessr2.3.0之前,使用vm进行隔离渲染,但是也带来了性能问题。详情请参考文档的介绍。动态执行字符串代码:这个只能在一些需求场景下使用vm。劣质的vm也有明显的缺点:资源消耗:这里有一篇比较eval和vm性能的文章:https://odino.org/eval-no-more-understanding-vm-vm2-nodejs/。(当然eval的安全问题更大,这是另外一个话题了)。可能被攻击的vm也存在安全问题,可能导致执行外部代码的安全问题。于是就有了专门解决这个问题的开源库https://github.com/patriksimek/vm2,里面声明已经过滤掉所有已知的攻击。