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

3
我们计划在 node.js + express 上开发一个面向企业的应用平台,并希望允许用户运行自己的本地 node.js 模块(一组 js、css、html 文件),通常应该像门户和小部件/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或子进程仅使用特定文件夹?目前我不知道如何处理数据库,但我认为当用户安装他的模块时,平台应该复制所有文件并为用户创建一个db方案,然后当模块启动时,我只需要传递连接到用户dbscheme的对象。

请帮助我,我真的是nodes的新手,有什么建议可以解决我的问题吗?

提前致谢

1个回答

3
您可以创建一个环绕 require 的 shim 函数,执行您想要的验证,然后调用系统的 require 函数。然后,您可以将其作为“require”的替代项传递给沙箱。
我不确定为 node.js 创建“安全”沙箱所需的所有更改。在某种程度上,这将取决于用户提交的模块需要做什么。
一种帮助确保用户模块无法干扰您代码的方法是在它们自己的进程中运行。在 Unix 系统上,可以使用 chroot 来创建独立的文件系统以供进程运行,并通过 stdio 管道或套接字与进程通信。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接