nodejs:是否有可能使用runInNewContext评估js代码,并限制其执行时间超时?

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

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

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

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

我想你所说的是完全正确的。 我认为唯一的select是填写Joyent / Ryan Dahl的问题 。 希望他/他们可以拿出一些聪明的东西,也许会告诉你这是不可能的。

来自vm.runInNewContext :

请注意,运行不受信任的代码是一项棘手的业务,需要非常小心。 为了防止意外的全局variables泄漏,vm.runInNewContext是相当有用的,但安全运行不可信代码需要一个单独的进程。

所以要安全地做到这一点,你需要运行在外部程序。 我认为这个“昂贵的部分”可以通过preforking来避免。

一个控制过程负责启动监听连接并在到达时提供服务的subprocess。 Apache总是试图维护几个备用或空闲的服务器进程,这些进程已经准备好接收传入的请求。 通过这种方式,客户端不需要等待新的subprocess在被请求之前被分叉。

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

这是现在可能的,因为我添加了对Node vm模块的timeout参数支持。 您可以简单地将毫秒超时值传递给runInNewContext() ,如果代码没有在指定的时间内完成执行,则会引发exception。

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

 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