2013-04-02 2 views
3

Мы планируем разработать платформу бизнес-ориентированного приложения на узле.js + express. И нам нравится разрешать пользователям запускать собственные собственные модули node.js (набор файлов js, css, html), поэтому обычно это должно быть похоже на портал и порты/сервлеты. Пользователи должны иметь возможность устанавливать модули на стороне сервера со своей клиентской частью, и эти модули должны взаимодействовать с платформой и другими модулями, чтобы добавить некоторые api. Поэтому необходимо изолировать эти модули от прямого доступа к системным файлам и базе данных, но они должны иметь доступ к своим собственным файлам и базе данных. Пожалуйста, помогите мне, в каком направлении мы должны копать, чтобы обеспечить безопасность. Я проверил информацию о: песочнице в vm и дочернем процессе.Как безопасно запускать пользовательские модули в узле node.js?

Я пробовал:

// 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'; 
}); 

Я прошел ТРЕБУЮТ объект в модуль, чтобы сделать возможным включить некоторые дополнительные файлы, но он открывает доступ для всех системных файлов, можно сказать VM или дочерний процесс работы только с конкретными папками? В настоящее время я понятия не имею, как работать с базой данных, но я думаю, что когда пользователь установит свой модуль, платформа должна скопировать все файлы и создать схему db для пользователя, а затем, когда модуль запустится, мне нужно передать только объект, который подключен к пользователю dbscheme.

Пожалуйста, помогите мне, я действительно новичок в узлах, любые предложения по решению моей проблемы?

Заранее спасибо

ответ

3

Одна вещь, которую вы могли бы сделать, это создать функцию регулировочной шайбы вокруг требуют, делает все проверки вы хотите, а затем вызывает система требуют функции. Затем вы можете передать это в песочницу в качестве замены «require».

Я не уверен в всех изменениях, которые необходимы для создания «защищенной» песочницы для node.js. В какой-то степени это будет зависеть от того, что должны делать пользовательские модули.

Один из способов обеспечить, чтобы пользовательские модули не могли помешать вашему коду, заключался в том, чтобы запускать их в своем собственном процессе. В системе unix вы можете использовать chroot для создания изолированной файловой системы для запуска процесса, а затем обмениваться данными с процессом через stdio-канал или сокет.

Смежные вопросы