标签: node-vm2

NodeJS vm 用例

我对 NodeJS 中 VM 模块的用例感到困惑。

在阅读了有关此模块的文档中的一些内容后,它看起来像是一种进行 eval 的奇特方式。

有没有人使用过它并活着告诉尾巴它的用例?

javascript node.js nodevm node-vm2

6
推荐指数
1
解决办法
770
查看次数

如何获取Node vm2运行代码的结果

最近,我一直在尝试使用vm2包来实现沙箱执行@Patrik \xc5\xa0imek 发布的

\n\n

我正在尝试运行一些 js 代码,我认为它是自定义逻辑,我将此逻辑存储在一个字符串变量中。

\n\n

我需要在沙箱环境中执行此自定义逻辑(因为这是不可信代码),并在实际环境中获取响应,以便根据此结果继续正常的应用程序流程。

\n\n

我尝试了多种方法才得到最终结果。自定义逻辑在沙箱内成功执行,但我无法找到一种方法将此结果发送回主进程,但我得到的结果为未定义。因此,到目前为止,还没有任何效果。

\n\n

希望我在这里得到一些答案。

\n\n

自定义逻辑(将存储在字符串中)

\n\n
function addValues(a,b){\n   var c = a + b;\n   console.log(\'Addition of 2 values\');\n   console.log(c); \n   return c;\n}\n\naddValues(10,10); // function call\n
Run Code Online (Sandbox Code Playgroud)\n\n

实际实施

\n\n
// vm2 \n const {NodeVM} = require(\'vm2\');\n        const vm = new NodeVM({\n            console: \'inherit\',\n            sandbox: {},\n            require: {\n                external: true,\n                builtin: [\'fs\',\'path\'],\n                root: "./",\n                mock: {\n                    fs: {\n                        readFileSync() { return \'Nice try!\';}\n                    }\n                },\n …
Run Code Online (Sandbox Code Playgroud)

node.js nodevm node-vm2

5
推荐指数
1
解决办法
3150
查看次数

设置为“重定向”时,NodeJS VM2 访问控制台的正确方法

我正在使用VM2包来运行用户代码。我正在尝试拦截控制台输出并将 NodeVM 对象的控制台属性设置为“重定向”:

    // Create a new sandbox VM for this request
    const vm = new NodeVM( {
        console: 'redirect',
        timeout: 30000,
        sandbox: { request, state, response },
        require: {
            external: true
        }
    });
Run Code Online (Sandbox Code Playgroud)

根据将控制台输出重定向到“事件”的文档。我是 NodeJS 的新手,如何连接到这些事件以捕获在沙箱内执行的 console.log 消息?

node.js node-vm2

5
推荐指数
1
解决办法
1117
查看次数

如何将 vm.SourceTextModule 创建的模块的导入依赖项链接到它?

假设我们正在创建一个app通过构造新vm.SourceTextModule对象来调用的模块:

const context = {
  exports: {},
  console,  // custom console object
};
const sandbox = vm.createContext(context);

const app = new vm.SourceTextModule(
  `import path from 'path';
   console.log(path.resolve('./src'));`,
  {
    context: sandbox,
  }
);
Run Code Online (Sandbox Code Playgroud)

根据Node.js 文档,要从模块获取默认导出,path我们应该将模块导入的依赖项“链接”app到它。
为了实现这一点,我们应该将linker回调传递给app.link方法:

async function linker(specifier, referencingModule) {
    // the desired logic...
}

await app.link(linker);
Run Code Online (Sandbox Code Playgroud)

如何linker正确实现功能,以便我们可以path在新创建的模块中导入模块app并使用它:

await app.evaluate();  // => /home/user/Documents/project/src
Run Code Online (Sandbox Code Playgroud)

PS 我们正在使用TypeScript,所以我检查了我们是否安装了path包的类型。

包.json …

javascript node.js node-vm2

4
推荐指数
1
解决办法
605
查看次数

如何结束Node VM2当前正在运行的任何代码

我正在使用vm2在Node中运行一些沙盒代码。

正在运行的代码将大部分是异步的。它是不受信任的代码,并且不能以任何方式依赖它,因此,我为什么vm2要运行它。

vm2是否可以结束当前正在执行的任何代码?该文档非常有限。例如,如果我要使用以下代码:

var code = 'setInterval(function(){ console.log("tick"); }, 1000);'
vm.run(code);
Run Code Online (Sandbox Code Playgroud)

我有什么办法可以运行上述代码,并在将来的某个时候将其停止,而控制代码不必了解的内容code,也不必code提供任何特定功能?

我找不到vm.stop()方法或类似方法。

node.js node-vm2

1
推荐指数
1
解决办法
433
查看次数

Node.js vm2 使用函数在 VM 和主代码之间交换信息

我正在使用该vm2模块,并且我有一些带有两个函数的代码:get_input()用于获取我拥有的一些数据,以及display()用于显示一些数据,但这些函数不会在该代码中定义。如何创建某种可以运行以get_input()从数组中提供数据并使用该display()函数将一些数据输出到我的主代码的外部函数?基本上我想这样做:

  • vm2 中运行的代码进行get_input()调用
  • 数组中的数据被发送到该函数
  • 使用 vm2 实例中的代码评估数据
  • vm2 代码进行调用display(),将数据输出到我的主代码上的另一个数组

任何帮助,将不胜感激。

node.js node-vm2

1
推荐指数
1
解决办法
2084
查看次数

标签 统计

node-vm2 ×6

node.js ×6

javascript ×2

nodevm ×2