在nodejs应用程序中使用安全脚本



我想构建一个nodejs应用程序,允许用户输入他们自己的JavaScript脚本来与我的应用程序API进行交互,以实现可扩展性。

我希望这是安全的;我只希望向脚本公开一组特定的对象。

是否有一种安全的方法在节点上做到这一点?

sandbox模块生成一个子进程,并在vm模块提供的新上下文中运行用户脚本。在用户脚本中没有全局变量或node.js方法可以访问,因为global变量被重新定义了(参见第28行,45-47,文件shovel.js)。

如果你想公开一些对象和函数,例如

var myobj = { x:12, y:12};
var add = function(a, b) { return a + b; };

到用户脚本,例如

var b =  100;
myobj.x = add(myobj.x, b);

,将对象和函数添加到用户脚本中,并通过sandbox像这样运行它:

var Sandbox = require('sandbox');
var s = new Sandbox();
s.run('myobj=' + JSON.stringify(myobj) + ';'
         + 'add=' + add.toString() + ';'
         + userscript
         + '; print(myobj);',
        function( output ) {
           console.log(output);
});

输出包含myobj的新值:

{ result: 'null', console: [ { x: 112, y: 12 } ] }

有一个相对的讨论:如何限制访问api在node.js javascript?为了防止意外的全局变量泄漏,vm.runInNewContext非常有用,但是安全运行不受信任的代码需要一个单独的进程。' (见http://nodejs.org/api/vm.html)

最新更新