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



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

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

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

使用dnode或child_process.fork在外部进程中运行脚本,设置截止日期计时器,如果超时则终止进程,如果脚本完成则终止计时器。

我想在中使用runInNewContext执行一个不受信任的js代码node.js,但就我所见,没有办法限制它的执行时间它也是一个同步操作。有办法设置超时吗它或它的异步版本将允许我控制它的执行来自"外部"?

我想你说的完全是真的。我认为唯一的选择是用Joyent/Ryan Dahl来解决问题。希望他/他们能想出一些聪明的办法,或者可能会告诉你这是不可能的。

来自vm.runInNewContext:

请注意,运行不受信任的代码是一项棘手的业务,需要照顾为了防止意外的全局变量泄漏,vm.runInNewContext非常有用,但可以安全地运行不受信任的代码需要单独的过程。

所以要安全地完成这项工作,您需要在外部程序中运行。我认为"昂贵的部分"可以通过预先加工来避免。

单个控制进程负责启动子进程它们监听连接并在连接到达时为它们提供服务。Apache总是尝试维护几个备用或空闲的服务器进程随时准备为收到的请求提供服务。通过这种方式,客户端不会需要等待新的子进程分叉可以满足请求。

这是可能的,因为我向Node vm模块添加了对timeout参数的支持。您可以简单地将毫秒超时值传递给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

最新更新