我想在 Node 中运行一些不受信任的代码,如下所示:
for (var i = 0; i < 5; i++){
green_led(1);
sleep(500);
green_led(0);
sleep(500);
}
使用 Fibers,我得到了按预期工作的同步行为:
var Fiber = require('fibers');
function sleep(ms){
var fiber = Fiber.current;
setTimeout(function(){ fiber.run(); }, ms);
Fiber.yield();
}
function green_led(active){
//...
}
Fiber(function(){
for (var i = 0; i < 5; i++){
green_led(1);
sleep(500);
green_led(0);
sleep(500);
}
}).run();
困难在于如何对代码进行沙箱化。不得不使用 Fibers 让事情变得非常复杂。我不确定如何开始。如何使用vm2将上述沙盒化?例如,以下显然行不通:
var code = "\
for (var i = 0; i < 5; i++){\
green_led(1);\
sleep(500);\
green_led(0);\
sleep(500);\
}\
";
function sleep(ms){
var fiber = Fiber.current;
setTimeout(function(){ fiber.run(); }, ms);
Fiber.yield();
}
function green_led(active){
//...
}
Fiber(function(){
vm.run(code);
}).run();
(它不起作用,因为VMgreen_led
中sleep
的沙盒代码不可见)。
这应该怎么做?任何一个...
- 也许一切都应该在虚拟机内部运行,包括光纤和实现
green_led
等? - 或者最好让VM运行的代码最小化,而不是以某种方式白名单/代理
green_led
和sleep
?在灰质上并不容易,首先要理解纤维是如何工作的已经够难的了!