node之vm2库,js沙盒环境

2024-01-02 06:00:16
一、简介

vm2 是一个用于在 Node.js 中创建沙盒环境的模块。它提供了一种安全执行 JavaScript 代码的方式,可以隔离和限制代码的访问权限,防止恶意代码对系统造成损害。
以下是一些关于 vm2 模块的简介:

  1. 创建沙盒环境:vm2 允许你创建一个虚拟机实例(VM),在该实例中运行 JavaScript 代码。这个虚拟机实例是一个隔离的环境,与主 Node.js 进程相互独立,可以在其中执行代码。
  2. 限制访问权限:vm2 允许你限制代码对系统资源的访问权限。你可以控制代码能否访问全局对象、模块、文件系统和网络等资源,从而提供更高的安全性。
  3. 沙盒选项:vm2 提供了一系列选项,可以根据需要进行配置。你可以设置允许的模块访问列表、全局变量、沙盒中的环境变量等。
  4. 代码执行和交互:vm2 支持执行 JavaScript 代码字符串、文件或函数。你可以在虚拟机中运行代码,并获取执行结果。此外,你还可以在代码之间建立上下文,并在它们之间进行交互。
  5. 错误处理:vm2 提供了错误处理机制,可以捕获虚拟机中发生的错误,并提供有关错误的详细信息。
    使用 vm2 模块可以帮助你在 Node.js 中创建安全的沙盒环境,用于执行不受信任的代码或提供代码隔离。它在一些场景中非常有用,例如在多租户环境中运行用户提交的代码、实现插件系统等。
    虽然 vm2 提供了一定的安全性,但仍然需要谨慎处理不受信任的代码,并仔细配置沙盒环境以确保安全性。
二、安装
npm install vm2
三、创建沙盒对象:new vm
  1. 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。
  1. VM.run(script, options):在虚拟机中执行指定的脚本。script 参数是要执行的脚本代码,options 参数是一个可选的配置对象,用于配置虚拟机的行为。执行结果将返回给调用者。
  2. VM.runFile(filename):从指定的文件中读取脚本代码,并在虚拟机中执行。filename 参数是要执行的文件路径。执行结果将返回给调用者。
  3. VM.setGlobals(values):设置虚拟机的全局变量。values 参数是一个对象,其中键是全局变量的名称,值是对应的值。
  4. VM.setGlobal(name, value):设置虚拟机的单个全局变量。name 参数是全局变量的名称,value 参数是对应的值。
  5. VM.getGlobal(name):获取虚拟机的单个全局变量的值。name 参数是全局变量的名称。
  6. VM.freeze(object, name):将指定的对象冻结,并将其作为不可修改的全局变量添加到虚拟机中。object 参数是要冻结的对象,name 参数是全局变量的名称。
  7. VM.readonly(object):将指定的对象设置为只读,并将其作为不可修改的全局变量添加到虚拟机中。
  8. VM.protect(object, name):将指定的对象设置为受保护的(不可删除、不可修改),并将其作为全局变量添加到虚拟机中。object 参数是要保护的对象,name 参数是全局变量的名称。
四、创建虚拟环境js:new VMScript
  1. script = new VMScript(code,path,options):创建script对象
  • code:要执行的脚本代码。可以是字符串形式的 JavaScript 代码。
  • path:可选参数,表示脚本的路径。通常用于在脚本中使用相对路径引入其他模块。
  • options:可选参数,是一个配置对象,用于设置脚本的行为。支持以下选项:
  • filename:与 path 参数相同,表示脚本的路径。
  • lineOffset:脚本代码的起始行号偏移量。默认为 0。
  • columnOffset:脚本代码的起始列号偏移量。默认为 0。
  • compiler:指定要使用的 JavaScript 编译器。可选值为 ‘javascript’ 或 ‘babel’。默认为 ‘javascript’。
  1. VMScript.wrap(prefix, postfix):用于将脚本代码包装在指定的前缀和后缀中。这在需要在脚本执行之前或之后添加一些代码时非常有用。
  2. VMScript.compile():用于将脚本代码编译为可执行的函数。编译后的函数可以在虚拟机中执行。
五、虚拟机模拟文件系统:new VMFileSystem
  1. 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:用于获取路径中的目录名部分。
  1. VMFileSystem.statSync(): 用于同步地获取文件或目录的状态信息。
  2. VMFileSystem.readFileSync(): 用于同步地读取文件的内容。
  3. VMFileSystem.resolve(): 用于将路径片段解析为绝对路径。
  4. VMFileSystem.isAbsolute(): 用于判断一个路径是否为绝对路径。
  5. VMFileSystem.join(): 用于将多个路径片段拼接成一个路径。
  6. VMFileSystem.basename():用于获取路径中的文件名部分。
  7. VMFileSystem.dirname(): 用于获取路径中的目录名部分。
  8. 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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。