我正在学习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