次のような信頼できないコードを Node で実行したいと考えています。
for (var i = 0; i < 5; i++){
green_led(1);
sleep(500);
green_led(0);
sleep(500);
}
ファイバーを使用して、同期動作が期待どおりに機能するようになりました。
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();
問題は、コードをサンドボックス化する方法です。ファイバーを使用する必要があるため、非常に複雑になります。どうやって始めればいいのかよくわかりません。上記を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();
( VM 内のサンドボックス化されたコードにはgreen_led
とが表示されないため、機能しません)。sleep
これはどのように行うべきですか?また...
- おそらく、ファイバーや実装
green_led
など、すべてを VM 内で実行する必要がありますか? - それとも、VM によって実行されるコードを最小限に抑え、代わりに何らかの方法でホワイトリスト/プロキシを使用する方がよいでしょう
green_led
かsleep
? そもそも繊維がどのように機能するかを理解するのは非常に困難です。