nodejs应用程序中的安全脚本

时间:2014-03-20 22:51:33

标签: javascript node.js security scripting extensibility

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

我希望这是安全的;我只想要一组特定的对象暴露给脚本。

在节点中是否有安全的方法?

1 个答案:

答案 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>