Ich möchte einige nicht vertrauenswürdigem Code in Knoten auszuführen, die wie folgt aussehen könnte:Kombinieren NodeJS Fibers + VM Sandbox
for (var i = 0; i < 5; i++){
green_led(1);
sleep(500);
green_led(0);
sleep(500);
}
Verwendung von Fasern, bekam ich das synchrone Verhalten wie erwartet funktioniert:
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();
Die Schwierigkeit besteht darin, den Code zu sandboxieren. Die Verwendung von Fasern macht es wirklich kompliziert; Ich bin mir nicht sicher, wie ich anfangen soll. Wie kann ich die obige Sandbox mit vm2 bekommen? Zum Beispiel wird im Folgenden offensichtlich nicht:
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();
(Es wird nicht funktionieren, weil green_led
und sleep
in der VM nicht sichtbar für den Sandbox-Code sind).
Wie soll das gemacht werden? Entweder ...
- Vielleicht sollte alles innerhalb der VM ausgeführt werden, einschließlich Fasern und Implementierung von
green_led
usw.? - Oder wäre es besser, Code von der VM minimal gehalten zu halten, und stattdessen irgendwie Whitelist/Proxy
green_led
undsleep
? Nicht gerade leicht in der grauen Materie, es ist schwer genug zu verstehen, wie Fibers überhaupt funktioniert!