node之vm2库,js沙盒环境
发布时间:2024年01月02日
一、简介
vm2 是一个用于在 Node.js 中创建沙盒环境的模块。它提供了一种安全执行 JavaScript 代码的方式,可以隔离和限制代码的访问权限,防止恶意代码对系统造成损害。
以下是一些关于 vm2 模块的简介:
- 创建沙盒环境:vm2 允许你创建一个虚拟机实例(VM),在该实例中运行 JavaScript 代码。这个虚拟机实例是一个隔离的环境,与主 Node.js 进程相互独立,可以在其中执行代码。
- 限制访问权限:vm2 允许你限制代码对系统资源的访问权限。你可以控制代码能否访问全局对象、模块、文件系统和网络等资源,从而提供更高的安全性。
- 沙盒选项:vm2 提供了一系列选项,可以根据需要进行配置。你可以设置允许的模块访问列表、全局变量、沙盒中的环境变量等。
- 代码执行和交互:vm2 支持执行 JavaScript 代码字符串、文件或函数。你可以在虚拟机中运行代码,并获取执行结果。此外,你还可以在代码之间建立上下文,并在它们之间进行交互。
- 错误处理:vm2 提供了错误处理机制,可以捕获虚拟机中发生的错误,并提供有关错误的详细信息。
使用 vm2 模块可以帮助你在 Node.js 中创建安全的沙盒环境,用于执行不受信任的代码或提供代码隔离。它在一些场景中非常有用,例如在多租户环境中运行用户提交的代码、实现插件系统等。
虽然 vm2 提供了一定的安全性,但仍然需要谨慎处理不受信任的代码,并仔细配置沙盒环境以确保安全性。
二、安装
npm install vm2
三、创建沙盒对象:new vm
- vm = new VM(options):创建沙盒对象
- compiler:指定要使用的 JavaScript 编译器。可以选择 “javascript”、“coffeescript” 或自定义的编译器函数(CompilerFunction)。
- sandbox:指定虚拟机的全局对象。可以是任意类型的对象。
- console:指定是否允许代码访问全局的 console 对象。默认为 false,禁止访问。
- require:指定允许访问的模块列表。可以是一个字符串数组,也可以是一个函数。默认为 [],不允许访问任何模块。
- import:指定允许访问的 ECMAScript 模块列表。可以是一个字符串数组,也可以是一个函数。默认为 [],不允许访问任何 ECMAScript 模块
- timeout:指定代码执行的超时时间(以毫秒为单位)。该超时时间仅对通过 run 方法运行的代码有效,对于虚拟机返回的任何方法无效。
- eval:如果设置为 false,则禁止使用 eval 函数或函数构造器(Function、GeneratorFunction 等)。默认值为 true。
- wasm:如果设置为 false,则禁止编译和执行 WebAssembly 模块。默认值为 true。
- allowAsync:如果设置为 false,则禁止使用 async 运行代码时会抛出 VMError。默认值为 true。
- VM.run(script, options):在虚拟机中执行指定的脚本。script 参数是要执行的脚本代码,options 参数是一个可选的配置对象,用于配置虚拟机的行为。执行结果将返回给调用者。
- VM.runFile(filename):从指定的文件中读取脚本代码,并在虚拟机中执行。filename 参数是要执行的文件路径。执行结果将返回给调用者。
- VM.setGlobals(values):设置虚拟机的全局变量。values 参数是一个对象,其中键是全局变量的名称,值是对应的值。
- VM.setGlobal(name, value):设置虚拟机的单个全局变量。name 参数是全局变量的名称,value 参数是对应的值。
- VM.getGlobal(name):获取虚拟机的单个全局变量的值。name 参数是全局变量的名称。
- VM.freeze(object, name):将指定的对象冻结,并将其作为不可修改的全局变量添加到虚拟机中。object 参数是要冻结的对象,name 参数是全局变量的名称。
- VM.readonly(object):将指定的对象设置为只读,并将其作为不可修改的全局变量添加到虚拟机中。
- VM.protect(object, name):将指定的对象设置为受保护的(不可删除、不可修改),并将其作为全局变量添加到虚拟机中。object 参数是要保护的对象,name 参数是全局变量的名称。
四、创建虚拟环境js:new VMScript
- script = new VMScript(code,path,options):创建script对象
- code:要执行的脚本代码。可以是字符串形式的 JavaScript 代码。
- path:可选参数,表示脚本的路径。通常用于在脚本中使用相对路径引入其他模块。
- options:可选参数,是一个配置对象,用于设置脚本的行为。支持以下选项:
- filename:与 path 参数相同,表示脚本的路径。
- lineOffset:脚本代码的起始行号偏移量。默认为 0。
- columnOffset:脚本代码的起始列号偏移量。默认为 0。
- compiler:指定要使用的 JavaScript 编译器。可选值为 ‘javascript’ 或 ‘babel’。默认为 ‘javascript’。
- VMScript.wrap(prefix, postfix):用于将脚本代码包装在指定的前缀和后缀中。这在需要在脚本执行之前或之后添加一些代码时非常有用。
- VMScript.compile():用于将脚本代码编译为可执行的函数。编译后的函数可以在虚拟机中执行。
五、虚拟机模拟文件系统:new VMFileSystem
- file = new VMFileSystem(options):创建文件对象
- fs:一个自定义的文件系统对象,用于替代默认的文件系统实现
- statSync: typeof fs.statSync:用于获取文件或目录的状态信息
- readFileSync: typeof fs.readFileSync:用于同步读取文件的内容
- path:一个自定义的路径模块对象,用于替代默认的路径模块实现
- resolve: typeof pa.resolve:用于将路径片段解析为绝对路径。
- isAbsolute: typeof pa.isAbsolute:用于判断一个路径是否为绝对路径。
- join: typeof pa.join:用于将多个路径片段拼接成一个路径。
- basename: typeof pa.basename:用于获取路径中的文件名部分。
- dirname: typeof pa.dirname:用于获取路径中的目录名部分。
- VMFileSystem.statSync(): 用于同步地获取文件或目录的状态信息。
- VMFileSystem.readFileSync(): 用于同步地读取文件的内容。
- VMFileSystem.resolve(): 用于将路径片段解析为绝对路径。
- VMFileSystem.isAbsolute(): 用于判断一个路径是否为绝对路径。
- VMFileSystem.join(): 用于将多个路径片段拼接成一个路径。
- VMFileSystem.basename():用于获取路径中的文件名部分。
- VMFileSystem.dirname(): 用于获取路径中的目录名部分。
- VMFileSystem.isSeparator(char: string): 用于判断给定的字符 char 是否为路径分隔符(path.sep)。如果 char 是路径分隔符,函数返回 true;否则返回 false。
六、简单示例
const {VM, VMScript} = require("vm2");
const script = new VMScript("let a = 2;a");
let vm = new VM();
console.log(vm.run(script));
文章来源:https://blog.csdn.net/randy521520/article/details/134752642
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!