2013-04-02 43 views
3

我們正計劃在node.js + express上開發面向業務的應用平臺。我們希望允許用戶運行自己的本地node.js模塊(文件集js,css,html),所以通常它應該像門戶網站和portles/servlet一樣。用戶應該有能力在客戶端部分的服務器端安裝模塊,這些模塊應該與平臺交互,其他模塊會引發一些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'; 
}); 

我通過REQUIRE對象模塊,以使可能包括一些額外的文件,但它打開了所有的系統文件的訪問,是可以告訴VM或子進程工作只有特定的文件夾?目前我不知道如何使用數據庫,但我認爲當用戶將安裝他的模塊時,平臺應該複製所有文件併爲用戶創建一個數據庫方案,然後當模塊啓動時,我只需要傳遞連接到用戶的對象dbscheme。

請幫助我,我真的是新的節點,任何建議如何解決我的問題?

在此先感謝

回答

3

有一兩件事你可以做的是創造一個墊片功能周圍需要,你想要做任何驗證,然後調用系統的需要的功能。然後,您可以將它傳遞到沙箱作爲「需求」的替代。

我不確定爲node.js製作「安全」沙箱所需的所有更改。在某種程度上,這將取決於用戶提交的模塊需要做什麼。

幫助確保用戶模塊不會干擾您的代碼的一種方法是在他們自己的進程中運行它們。在unix系統上,可以使用chroot爲進程運行創建一個獨立的文件系統,然後通過stdio管道或套接字與進程進行通信。

相關問題