nodejs:是否可以使用runInNewContext来评估js代码并将其执行时间限制为超时?

时间:2011-06-30 02:23:40

标签: node.js

我想在node.js中使用runInNewContext执行不受信任的js代码,但据我所知,无法限制其执行时间。它也是一个同步操作。有没有办法设置它的超时或它的异步版本,这将允许我从“外部”控制它的执行?

更新:在外部流程中运行并不好:

  • 占用太多资源
  • 更重要的是,我需要代码才能通过沙箱环境访问我的数据/代码

3 个答案:

答案 0 :(得分:1)

使用dnodechild_process.fork在外部进程中运行脚本,设置截止时间计时器并在达到超时时终止进程,或者在脚本完成时设置计时器。

答案 1 :(得分:0)

  

我想使用runInNewContext执行不受信任的js代码   node.js但据我所知,没有办法限制它的执行   时间。它也是一个同步操作。有没有办法设置超时   它或它的异步版本,将允许我控制其执行   从'外面'?

我认为你说的是​​完全正确的。我认为唯一的选择是填写Joyent/Ryan Dahl的问题。希望他/他们可以提出一些聪明的东西,或者可能会告诉你这是不可能的。

来自vm.runInNewContext

  

请注意,运行不受信任的代码是一件非常棘手的事情   关心。为防止意外的全局变量泄漏,   vm.runInNewContext非常有用,但可以安全地运行不受信任的代码   需要一个单独的过程。

所以要安全地执行此操作,您需要在外部程序中运行。我认为preforking可以避免“昂贵的部分”。

  

单个控制进程负责启动子进程   当他们到达时,他们会听取连接并为他们提供服务阿帕奇   总是试图维护几个备用或空闲的服务器进程   随时准备服务于传入的请求。通过这种方式,客户不会   需要等待一个新的子进程在他们之前分叉   请求可以提供。

答案 2 :(得分:-2)

现在可以这样做,因为我向节点timeout模块添加了vm参数支持。您可以简单地将毫秒超时值传递给runInNewContext(),如果代码未在指定的时间内完成执行,则会抛出异常。

请注意,这并不意味着运行不受信任的代码的任何类型的安全模型。这简单地允许您超时您信任或以其他方式保护的代码。

var vm = require("vm");

try {
    vm.runInNewContext("while(true) {}", {}, "loop", 1000);
} catch (e) {
    // Exception thrown after 1000ms
}

console.log("finished"); // Will now be executed

完全符合您的期望:

$ time ./node test.js
finished

real    0m1.069s
user    0m1.047s
sys     0m0.017s