6

我为我的用户提供了一种使用 JavaScript 转换数据的灵活方法,在服务器端使用 Node.js 执行。采用这种设计,需要考虑 3 个问题:

  • 安全性:我使用沙箱解决了安全问题,以避免使用本机 Node.js 库。

  • 资源:我们可以使用 v8 选项轻松设置最大内存使用量--max_executable_size。关于 CPU 使用率,我会看看如何使用cpulimitor来管理它renice,现在它并不重要。

  • 时间:我需要限制脚本的执行时间,以避免它们像僵尸一样运行。我在这里卡住了。

我尝试了类似的东西:

 node -e '
    setTimeout(function() {
       console.log("timeout");
       process.exit;
    }, 5000);
    console.log("begin");
    while (1);
 '

但是这段代码只显示“开始”,似乎我的超时从未被调用。任何的想法 ?

4

3 回答 3

8

您可能想查看tripwire ( https://github.com/tjanczuk/tripwire )。它是一个可以杀死失控节点脚本的模块,您可以设置超时。它是一个本地节点模块,所以这是需要考虑的一件事,但它适用于 Mac、Windows 和 Linux。

于 2014-06-09T21:09:30.517 回答
6

不幸的是,如果您的用户可以启动阻塞操作(如while(1)),则无法告诉 Node 在一定时间后退出,因为阻塞操作会阻止setTimeout处理程序触发。要么确保用户启动的东西不会阻塞主循环,要么(这是一个非常糟糕的主意)使用某种外部自动终止/超时来破坏节点进程。

基本上,您可以使用 Node 来限制非阻塞代码的执行时间,但 Node 的全部意义在于阻塞代码会阻塞一切。如果您的用户确实能够运行任意代码,我会考虑在更高级别运行您的进程管理器/超时杀手:例如,使用 Node 的exec工具生成具有终止超时的进程。

于 2013-03-02T16:38:01.520 回答
3

Node 的内置vm模块提供了module.evaluatescript.runInContext以及其他几种方法,它们将在沙盒环境中运行代码,并且可以timeout选择指定允许 VM 运行的最长时间(以毫秒为单位)。

请注意,在 Node.js 中运行不受信任的代码充满了潜在的安全问题。甚至 VM 模块都明确表示“ vm 模块不是一种安全机制。不要使用它来运行不受信任的代码。 ”(为什么不呢? 这是为什么不这样做的一个原因:看起来它运行起来应该是无害的,vm.runInNewContext("this.constructor.constructor('return process')().exit()")但实际上它将导致节点终止。

您也可以考虑使用Patrik Simekvm2,它提供了类似的功能,但声称“使用列入白名单的 Node 的内置模块运行不受信任的代码。安全!” 文档中的一个示例:

const {VM} = require('vm2');

const vm = new VM({
    timeout: 1000,
    sandbox: {}
});

vm.run("process.exit()"); // throws ReferenceError: process is not defined
于 2018-06-13T22:43:30.800 回答