我想构建一个nodejs应用程序,允许用户输入自己的JavaScript脚本,以便与我的应用程序API进行交互,以实现可扩展性。
我希望这是安全的;我只想要一组特定的对象暴露给脚本。
在节点中是否有安全的方法?
答案 0 :(得分:0)
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 } ] }
有一个相对讨论:How restrict access to apis in node.js javascript?。但是这种方法违反了规则:'为了防止意外的全局变量泄漏,vm.runInNewContext非常有用,但安全地运行不受信任的代码需要一个单独的过程。'(参见http://nodejs.org/api/vm.html)< / p>