我正在创建一个在 django 上运行的 corewars 类型的应用程序,并允许用户上传一些控制其角色的 python 代码。现在,我知道这个问题的真正答案是,只要我从不受信任的用户那里获取代码输入,我就会有安全漏洞。我只是想尽可能地降低风险。以下是一些让我想到的:
__import__
(我可能还会做一些 ast 扫描以确保没有任何导入语句)open
file
input
raw_input
还有其他我想念的吗?
在http://wiki.python.org/moin/SandboxedPython上有很多关于限制 Python 的一般方法的答案。当我前段时间查看它时,Zope RestrictedPython 看起来是最好的解决方案,它使用白名单系统。您仍然需要注意自己的代码,以免暴露任何安全漏洞,但这似乎是目前最好的系统。
你真的需要避免评估。想象一下代码,例如:
eval("__impor" + "t__('whatever').destroy_your_server")
这可能是最重要的一个。
是的,你必须列入白名单。有很多方法可以隐藏错误的命令。
这不是最坏的情况:
最坏的情况是有人进入数据库
最坏的情况是让整个机器植根,而你没有注意到它会探测你的其他机器并记录你的密码。隔离这台机器并认为它是敌对的(DMZ,阻止它在内部和外部发起攻击等)。在不可写媒体上运行tripwire 或AIDE,并将所有内容记录到第二台主机。
最后,正如plash所示,有许多危险的系统调用需要加以保护。
如果您不打算在游戏中使用 Python 作为语言,一种可能性是使用 LunaticPython 嵌入 Lua(我建议在https://code.launchpad.net/~dne/lunatic-python/bugfixes的错误修复分支)。
沙盒 Lua 比 Python 容易得多,嵌入 Lua 也比创建自己的编程语言容易得多。