【发布时间】:2017-04-24 12:47:54
【问题描述】:
我想在 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();
(它不起作用,因为green_led 和 sleep 对 VM 中的沙盒代码不可见)。
这应该怎么做?要么……
- 也许一切都应该在 VM 内运行,包括光纤和
green_led的实现等? - 或者最好保持VM运行的代码最少,而不是以某种方式将
green_led和sleep列入白名单/代理?在灰质上并不容易,首先要了解 Fibers 的工作原理已经够难了!
【问题讨论】:
标签: node.js node-fibers nodevm node-vm2