我们计划在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 或子进程仅使用特定文件夹?目前我不知道如何使用数据库,但我认为当用户安装他的模块时,平台应该复制所有文件并为用户创建一个数据库方案,然后当模块启动时我只需要传递连接到用户的对象数据库方案。
请帮助我,我对节点真的很陌生,有什么建议可以解决我的问题吗?
提前致谢