【问题标题】:secure scripting within a nodejs applicationnodejs 应用程序中的安全脚本
【发布时间】:2014-03-20 22:51:32
【问题描述】:

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

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

在节点中是否有一种安全的方法来执行此操作?

【问题讨论】:

  • 为此使用沙箱。例如,sandbox 模块。
  • 谢谢,但您似乎无法将对象暴露给沙箱?我看不到如何从沙箱中访问我的 api?

标签: javascript node.js security scripting extensibility


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 2010-10-03
    • 2015-03-03
    • 2016-04-09
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多