3

我们计划在node.js + express上开发一个面向业务的应用平台。而且我们喜欢允许用户运行他们自己的原生 node.js 模块(一组文件 js、css、html),所以通常它应该像门户和 portles/servlets。用户应该能够通过其客户端部分在服务器端安装模块,并且这些模块应该与平台交互,其他模块会抛出一些 api。因此需要将这些模块与对系统文件和数据库的直接访问隔离开来,但它们应该可以访问自己的文件和数据库。请帮助我我们应该挖掘什么方向以使其安全。我检查了以下信息:虚拟机和子进程中的沙箱。

我试过:

// 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 或子进程仅使用特定文件夹?目前我不知道如何使用数据库,但我认为当用户安装他的模块时,平台应该复制所有文件并为用户创建一个数据库方案,然后当模块启动时我只需要传递连接到用户的对象数据库方案。

请帮助我,我对节点真的很陌生,有什么建议可以解决我的问题吗?

提前致谢

4

1 回答 1

3

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

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

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

于 2013-04-02T19:47:14.517 回答