【发布时间】:2015-08-20 21:45:10
【问题描述】:
我有这个基于回合制的 NodeJs 游戏应用程序,开发人员(任何人)都可以在其中提交玩家机器人。我的 NodeJS 应用程序将加载所有玩家并让他们互相对抗。因为我对提交的代码一无所知,所以我需要在沙箱中运行它。
例如,以下不受信任的代码可能如下所示:
let history = [];
export default class Player {
constructor () {
this.history = [];
}
move (info) {
this.history.push(info);
}
done(result) {
history.push({result: result, history: this.history});
}
}
现在,在我的主应用程序中,我想做类似的事情
import Player1 from 'sandbox/player1';
import Player2 from 'sandbox/player2';
....
for (let outer = 0; outer < 10; outer ++) {
let player1 = creeateSandboxedInstance(Player1);
let player2 = creeateSandboxedInstance(Player2);
for(let inner = 0; inner < 1000000; inner ++) {
...
let move1 = player1.move();
let move2 = player2.doMove();
...
}
}
我希望 sandbox/creeateSandboxedInstance 环境照顾的是:
- 播放器类不应授予对文件系统/互联网的访问权限
- 播放器类不应访问应用全局变量
- 应重置任何状态(如类变量)
- 可能还有更多内容 :)
我认为我应该使用vm module。大概是这样的:
var vm = require('vm');
var script = new vm.Script('function move(info){ ... } ...', {conext});
var sandbox = script.runInNewContext();
script.move(..); // or
sandbox.move(..);
但是,我无法让它工作,因此我可以调用 move 方法。有没有可能?
【问题讨论】:
-
这能回答你的问题吗? How to run untrusted code serverside?
标签: javascript node.js sandbox