2013-07-09 51 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或管道系统命令等易受注入。因此,如果我要在这方面取得成功,我需要将不可信的对象划分到自己的世界中 - 外部世界可以调用方法,但不能调用外部世界的方法。任何人当然可以随意请告诉我他们可以想到的关于这个策略的任何进一步的安全漏洞。