问题标签 [node-vm2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
247 浏览

javascript - 尝试返回字符串 Nodejs VM 时的引用错误

我正在使用一个名为 safe-eval 的 npm 模块来评估我发送到后端的一些 JavaScript 代码。代码通常是一个函数,将在 safe-eval 内部使用我将提供的参数执行。问题是当返回某个值时,在这种情况下是一个字符串,它没有这样做,而是给我一个引用错误并将字符串值解释为一个变量。

问题发生在 forEach 的一次迭代中。

是的,我知道 forEach 不应该用作循环的控制语句,但在这种情况下,我这样做是为了使用我传递的参数列表来捕获执行期间可能出现的任何错误。

也就是说,当我使用此函数传递参数列表时会出现问题(此函数应该返回字符串 n 次):

这是我得到的回应。

{ "etype": "ReferenceError: codigocodigocodigo 未定义" }

0 投票
0 回答
105 浏览

javascript - 对 Vm2 js 的补充,可以安全地运行除 Javascript 以外的其他语言的不受信任的代码

我正在尝试实现一个 Node js Web 应用程序,其更简单的版本是用户以 C++、Python、Java、Js 等多种编程语言提交代码文件,并将生成的输出显示给他们。但是,我无法找到一种方法来运行代码文件,以免我的服务器受到影响。我想要一种方法来限制线程访问我的文件流并将超时设置为线程。我遇到了 npm 的 Vm2,但我猜它只运行 JS 代码。任何帮助,将不胜感激。

0 投票
0 回答
389 浏览

javascript - VM:setTimeout 在浏览器 vm.runInNewContext 中不起作用

我正在使用浏览器中的 vm 模块执行 JS 脚本,如下所示。

setTimeout、setInterval 和其他内置方法的间隔不起作用,即使我在使用创建的 sandboxObject 中公开它们vm.createContext({setTimeout})

输出:

需要注意的是,当我添加 .bind(this) 时,超时工作并在该行中断,说 .bind 不是函数。

输出:

铬 70

平台 Ubuntu 18.04

V8

0 投票
1 回答
103 浏览

node-vm2 - 如何允许文件系统访问

我想提供文件系统访问以用于fs. 如何授予 vm2 进程访问特定目录的权限?

我试过设置externaltrue和 a rootof /。该进程在 vm2 外部运行时能够访问该目录。

0 投票
1 回答
1052 浏览

javascript - 在 Node.js 中,如何从 vm2 返回 Promise?

我有一些异步 JavaScript 代码,我想使用 vm2 / NodeVM 运行它们。

该代码测试两个函数:一个用户提交的函数和一个使用 Node 内置库evenAndOdd的预定义函数。solutionassert

我的问题是,我怎样才能得到我已解决的承诺vm.run()

异步代码

这是我想变成字符串并运行的测试代码vm2

如果我附加以下代码,我会得到我想要记录到控制台的内容:

vm守则_

我的问题是,我如何获得已解决的承诺vm.run()

现在,result上面的变量是未定义的。

0 投票
0 回答
108 浏览

javascript - VM2 内存泄漏

我们将如何解决这个内存泄漏问题?当我遇到 100 个并发多个请求时,每次 VM2 创建新进程和内存泄漏时都会发生。如何解决这个问题呢?

0 投票
1 回答
1959 浏览

javascript - node.js中如何理解以下代码逃逸vm2沙箱

我尝试尽可能地理解下面的代码,因为理解它对我有很大帮助

上面的代码可以逃出 vm2 沙箱。我从 GitHub 克隆了 vm2 的源代码并重置为 7ecabb1。

我知道 vm2 比 vm 更安全,因为它在 es6 中通过代理阻塞了原型链。上面代码中,抛出异常并捕获,然后传入一个箭头函数x = > x.constructor ("return process") ();此时x为代理对象,可以访问外部Function进行逃逸

我也试试这段代码

但是在这段代码中,也是一样的,x => x.constructor ("return process") ()此时x是一个函数,无法逃出沙箱,所以我很困惑。第一段代码能逃出vm2沙箱的原因是什么?

0 投票
2 回答
474 浏览

javascript - 使用带有代码注入而不是线程的 NodeVM 时防止无限循环

最近正在使用 Node.js 构建一个 API,该 API 接收不受信任的代码以使用 vm2 运行它。问题是我想运行异步函数,所以我需要使用NodeVM不支持无限循环超时的方法,我发现所有关于使用子进程的解决方案,如果它不起作用则将其杀死。

但是我将代码作为字符串接收,并且我想防止其中出现无限循环,所以我想使用正则表达式来注入带有超时条件的 while/for 循环,或者在发生无限循环时抛出异常。

那可能吗?

0 投票
0 回答
30 浏览

javascript - 如何禁用/阻止节点需要插件?

我使用vm2沙盒只允许需要一些内部模块,但你如何阻止需要节点插件?插件也可能会做同样的事情,比如不允许的模块。我要把它剥掉/node/src/还是有其他方法?我找不到任何节点参数或 vm2 选项。

我的vm2配置是:

0 投票
0 回答
627 浏览

javascript - 如何在 VM2 沙箱中使用节点模块

我试图在沙箱中运行用户提交的脚本来处理一些数据,然后通过 node-fetch 通过 http 请求将输出发送到指定的端点。但是,我不确定我是否做得正确,即使在阅读了 VM2 的文档之后,我也不能完全确定我需要配置哪些选项。

这是一个示例,我调用 process(); inputData 为{ a: 123 },userScript 将是下图所示的 sampleScript.js。

sampleScript.js

我应该期待指定端点上的消息“12300”。但是,await fetch 方法调用似乎有问题,因为我在控制台上收到此错误:

(节点:36376)UnhandledPromiseRejectionWarning:错误:在 TCPConnectWrap.afterConnect [as oncomplete] 处连接 ECONNREFUSED 127.0.0.1:80(net.js:1141:16)(节点:36376)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志--unhandled-rejections=strict (请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。

这可能只是我配置沙箱选项的方式,因为我不确定我是否首先成功导入了 node-fetch 库。任何意见,将不胜感激!