我想构建一个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)