如何在node.js中安全地运行用户提交的模块?

时间:2013-04-02 16:47:39

标签: javascript node.js code-access-security

我们计划在node.js + express上开发面向业务的应用程序平台。我们希望允许用户运行他们自己的本地node.js模块(文件集js,css,html),所以通常它应该像portal和portles / servlets。用户应该有能力在服务器端安装模块及其客户端部分,这些模块应该与平台和其他模块交互抛出一些api。因此需要将这些模块与直接访问系统文件和数据库隔离开来,但是他们应该可以访问自己的文件和数据库。请帮助我挖掘方向以确保安全。 我检查了有关的信息:vm中的沙箱和子进程。

我试过了:

// Main file:
var util = require('util'),
  vm = require('vm'),
  fs = require('fs'),
  sandbox = {
    animal: 'cat',
    count: 2,
    require: require // I pass it to make possible for the module to
                     // include some additional files 
                     // but it opens access for all system files
  };
var context = vm.createContext(sandbox);

fs.readFile('./user_modules/index.js', 'utf8', function (err, data) {
  vm.runInNewContext(data, context);
  console.log(util.inspect(context));
});


//** User Module 
// user_modules/index.js

var fs = require('fs');
count++;
animal = 'Dog';

fs.readFile('README.md', 'utf8', function (err, data) {
  animal = 'Fox';
});

我将 REQUIRE 对象传递给模块,以便包含一些其他文件,但它可以打开所有系统文件的访问权限,是否可以告诉VM或子进程只能使用特定的文件夹?目前我不知道如何使用数据库,但我认为当用户安装他的模块时,平台应该复制所有文件并为用户创建数据库方案,然后当模块启动时我需要传递仅连接到用户的对象dbscheme。

请帮助我,我真的很新节点,有什么建议如何解决我的问题?

提前致谢

1 个答案:

答案 0 :(得分:3)

你可以做的一件事是围绕require创建一个shim函数,它可以执行你想要的任何验证,然后调用系统的require函数。然后,您可以将其传递到沙箱中,作为“require”的替代。

我不确定为node.js创建“安全”沙箱所需的所有更改。在某种程度上,这取决于用户提交的模块需要做什么。

帮助确保用户模块不会干扰代码的一种方法是在自己的进程中运行它们。在unix系统上,您可以使用chroot为进程运行创建一个独立的文件系统,然后通过stdio管道或套接字与进程通信。