我正在學習Node.js(-awesome-),我正在用它來創建下一代MUD(在線文本遊戲)的想法。在這樣的遊戲中,有各種命令,技能,法術等可以用來殺死壞人,當你跑來跑去,並探索數百個房間/地點。一般來說,這些功能非常穩定 - 你通常不能創建新的法術,或建立新的房間。然而,我想創建一個MUD,其中定義了法術和房間等的代碼可以由用戶編輯。Sandboxing Node.js模塊 - 可以完成嗎?
這有一些明顯的安全問題;一個惡意用戶可能會上傳一些JS,這些JS會分叉子進程'rm -r /'。我並不擔心保護遊戲內部的東西(我儘可能地保護內容,但只有一切都是公開的語言才能做到)。我總是可以跟蹤維基風格的代碼更改,並懲罰例如崩潰服務器,或提高他們的權力超過9000等,但我想堅決保護服務器的操作系統。
我已經研究過類似問題的其他SO答案,並且大多數人建議運行沙盒版本的Node。這在我的情況下(至少不是很好)不起作用,因爲我需要用戶定義的JS與MUD的引擎進行交互,MUD的引擎本身需要與文件系統,系統命令,敏感核心模塊等進行交互。假設所有這些事務都可以在引擎中進行JSON編碼,發送到沙盒進程,處理並通過JSON返回到引擎,但如果每次調用獲得玩家的生命值都需要傳遞給另一個進程。更不用說它是同步的,我寧願避免。
所以我想知道是否有一種方法來「沙盒」單個節點模塊。我的想法是,這樣一個沙箱將需要簡單地禁用'需求'功能,而且都是幸福的。所以,因爲我在Google/SO上找不到任何東西,我想我會自己提出這個問題。
這聽起來很整齊:)你如何看待在瀏覽器上運行用戶代碼,並讓它通過ajax將結果值提交給節點?這樣你就可以提供一些接口,只有某些值可以被修改(例如:健康,法力,等級,技能等),你可以在服務器端限制它們,並且你的服務器上沒有運行惡意代碼的機會。這看起來可能有用嗎? – asifrc
謝謝! :-)。不幸的是,這對我所要做的事情並不適用;它與沙盒處理方法非常相似。我想允許用戶提供的代碼來調用函數,並註冊事件等。例如,一個房間可能會註冊一個事件來檢測某人何時進入,然後自動打開一個魔光(拍;-))。或者NPC可能決定跟隨你,施放治療法術,或者根據敵人的弱點智能地施放元素法術等等。所以這些實體真的需要能夠與服務器上的每一個進行交互。雖然謝謝! – opensourcejunkie