2013-07-09 55 views
0

我正在學習Node.js(-awesome-),我正在用它來創建下一代MUD(在線文本遊戲)的想法。在這樣的遊戲中,有各種命令,技能,法術等可以用來殺死壞人,當你跑來跑去,並探索數百個房間/地點。一般來說,這些功能非常穩定 - 你通常不能創建新的法術,或建立新的房間。然而,我想創建一個MUD,其中定義了法術和房間等的代碼可以由用戶編輯。Sandboxing Node.js模塊 - 可以完成嗎?

這有一些明顯的安全問題;一個惡意用戶可能會上傳一些JS,這些JS會分叉子進程'rm -r /'。我並不擔心保護遊戲內部的東西(我儘可能地保護內容,但只有一切都是公開的語言才能做到)。我總是可以跟蹤維基風格的代碼更改,並懲罰例如崩潰服務器,或提高他們的權力超過9000等,但我想堅決保護服務器的操作系統。

我已經研究過類似問題的其他SO答案,並且大多數人建議運行沙盒版本的Node。這在我的情況下(至少不是很好)不起作用,因爲我需要用戶定義的JS與MUD的引擎進行交互,MUD的引擎本身需要與文件系統,系統命令,敏感核心模塊等進行交互。假設所有這些事務都可以在引擎中進行JSON編碼,發送到沙盒進程,處理並通過JSON返回到引擎,但如果每次調用獲得玩家的生命值都需要傳遞給另一個進程。更不用說它是同步的,我寧願避免。

所以我想知道是否有一種方法來「沙盒」單個節點模塊。我的想法是,這樣一個沙箱將需要簡單地禁用'需求'功能,而且都是幸福的。所以,因爲我在Google/SO上找不到任何東西,我想我會自己提出這個問題。

+0

這聽起來很整齊:)你如何看待在瀏覽器上運行用戶代碼,並讓它通過ajax將結果值提交給節點?這樣你就可以提供一些接口,只有某些值可以被修改(例如:健康,法力,等級,技能等),你可以在服務器端限制它們,並且你的服務器上沒有運行惡意代碼的機會。這看起來可能有用嗎? – asifrc

+0

謝謝! :-)。不幸的是,這對我所要做的事情並不適用;它與沙盒處理方法非常相似。我想允許用戶提供的代碼來調用函數,並註冊事件等。例如,一個房間可能會註冊一個事件來檢測某人何時進入,然後自動打開一個魔光(拍;-))。或者NPC可能決定跟隨你,施放治療法術,或者根據敵人的弱點智能地施放元素法術等等。所以這些實體真的需要能夠與服務器上的每一個進行交互。雖然謝謝! – opensourcejunkie

回答

1

好了,所以我多一些今天想過這個問題,我想我有一個基本的策略:

var require = function(module) { 
    throw "Uh-oh, untrusted code tried to load module '" + module + "'"; 
} 
var module = null; 
// use similar strategy for anything else susceptible 

var loadUntrusted = function() { 
    eval(code); 
} 

從本質上講,我們只是使用在本地範圍內的變量隱藏節點API從eval'ed代碼,並運行代碼。另一個弱點就是來自Node API的傳入不可信代碼的對象。如果例如一個緩衝區被傳遞給一個不可信的對象/函數,該對象/函數可以在原型鏈上工作,並用其自己的惡意版本替換關鍵緩衝區函數。這將使所有的緩衝區用於例如文件IO或管道系統命令等易受注入。因此,如果我要在這方面取得成功,我需要將不可信的對象劃分到自己的世界中 - 外部世界可以調用方法,但不能調用外部世界的方法。任何人當然可以隨意請告訴我他們可以想到的關於這個策略的任何進一步的安全漏洞。