我目前正在考虑在节点中运行用户提供的代码的问题。我有两个问题:
答案 0 :(得分:3)
您正在寻找runInNewContext
模块(vm documentation)中的vm
功能。
使用此功能时,它会创建非常有限的上下文。您需要将所需的任何内容传递到沙箱对象中,沙盒对象将成为全局对象。例如:如果您希望不受信任的代码写入控制台,则需要在沙箱对象中包含console
。
需要考虑的另一件事:创建一个新的上下文是一项非常昂贵的操作 - 需要额外的时间和内存。认真考虑一下,如果你绝对需要这个。还要认真考虑这种情况发生的频率。
示例:
var vm = require('vm');
var sandbox = {
console: console,
msg: "this is a test",
};
vm.runInNewContext('console.log(msg);', sandbox, 'myfile.vm');
// this is a test
编辑:需要考虑的更多内容:您将需要创建一个新进程来运行它。即使它处于新的上下文中,它仍然处于调用它的同一个进程中。因此,恶意用户可以简单地设置一个永不结束的for
循环,以便它永远不会退出。你需要弄清楚逻辑,知道什么时候发生这样的事情,这样你就可以杀死进程并创建一个新进程。
最后的想法:新的上下文在不受信任的代码中没有setTimeout or
setInterval . You may or may not want to add these. However, if you create a
setInterval`,并且不受信任的代码永远不会停止它然后它将永远继续。你需要找到一种方法来结束脚本,我可能还没有调查它。