PHP5内的沙盒或替代方案的建议?

时间:2008-10-27 19:41:55

标签: php sandbox

我一直在慢慢开展人事项目,使用extjs作为我的前端来运行类似于游戏的webmud。我做的一个设计选择是允许用户生成的游戏逻辑评估代码。因此,当玩家进入一个新的“房间”时,将会调用许多状态脚本:“玩家在此之前,如果他们在这里,他们是否有x库存项目”然后做出相应的响应。此外,基本房间“动作”将被硬编码(转到N / S / E / W),但高级动作将作为相同的用户生成的评估脚本提供。

最初我本来就是懒惰并且使用评估的PHP来实现这个逻辑,但是我的偏执感正在激发。所以我找到的两个替代方案是runkit_sandbox,但它不支持主线程之间的对象交换和沙箱(只是简单的数据类型和数组)或使用ecmascript作为我的游戏逻辑http://ejohn.org/blog/spicing-up-embedded-javascript/

两者的优点是,使用runkit,我可以非常努力地锁定脚本,速度巨大,而ecma解释器允许我有选择地将变量,函数和可能的对象绑定到javascript运行空间,但它仍处于测试状态,我还没看到它的运行情况。

这些是选择还是还有其他我不知道的东西可能是更好的选择?环境:linux,PHP-CGI 5.3或谷歌应用程序引擎。

2 个答案:

答案 0 :(得分:4)

我不建议评估用户提供的PHP代码 - 即使在runkit沙箱中也是如此。 PHP是一种非常复杂的语言,它与环境密切相关。在不知道细节的情况下,我预计人们可以利用许多漏洞打破沙箱。

还有其他语言可以嵌入,而不是javascript。 Lua是这类事情的热门选择。甚至还有php extension in pecl,其中包含绑定。

无论如何,如果你要使用runkit路由,你可以查看共享内存解决方案,例如memcache,以便在进程之间交换数据。

答案 1 :(得分:2)

有一个PHP Sandbox可用于提供基本内容。这是早期阶段,但看起来很有希望。

http://www.phpclasses.org/package/7015-PHP-Execute-external-PHP-scripts-in-a-separate-process.html

或来自GitHub: https://github.com/fregster/PHPSandbox