Python modding - 防止导入危险脚本?

时间:2012-03-17 15:44:56

标签: python security module

我想让用户自己制作Python" mods"对于我的游戏,将他们的脚本放在游戏"扫描"用于Python模块和导入。 什么是最简单的方法来预防"危险"来自导入的脚本?我不希望别人向我抱怨说他们使用了某人的mod并删除了他们的硬盘。 我想限制的是访问/修改/创建其文件夹之外的任何文件并连接到互联网/下载/发送数据。如果你能解决任何问题,请告诉我。

那怎么办呢?

4 个答案:

答案 0 :(得分:2)

受限制的Python似乎能够以干净的方式限制代码的功能,并且与高达2.7的python兼容。

http://pypi.python.org/pypi/RestrictedPython/

e.g。

  

通过提供不同的__builtins__字典,我们可以排除不安全的操作,例如打开文件[...]

答案 1 :(得分:0)

显而易见的方法是将模块加载为字符串并exec。这具有同样多的安全风险,但使用自定义globalslocals可能更容易阻止。看看this question - 它给出了一些非常好的指导。正如Delnan的评论所指出的那样,这并不完全安全。

您也可以尝试this。我没有使用它,但似乎为不安全的脚本提供了一个安全的环境。

答案 2 :(得分:0)

沙盒python执行有一些严重的缺点。 aquavitae的回答与这个问题的一些好的讨论有关,特别是this blog post。先读一下。

cPython中有一个安全执行的内核。基本思想是替换__builtins__全局(注意:而非__builtin__模块),这会通知python打开一些安全功能;在某些无法访问的对象上创建一些属性,并在评估该代码时从解释器中删除大多数实现对象。

然后你需要写一个实际的实现;以这种方式,受保护的模块不会泄漏到沙箱中。链接博客中的A fairly tested "file" replacement is provided。看一看可能会让您了解这个问题的复杂程度和复杂程度。


所以现在你已经明白这是python中的一个挑战;你应该看一下沙箱执行的语言作为核心功能,例如Lua,这在游戏中很受欢迎。

答案 3 :(得分:0)

给他们python执行并试图限制他们做的是要求麻烦。有关讨论和指向好文章的指针,请参阅this SO question。 (你可能会禁用“eval”,但在实践中它没有太大的区别。

我的建议:转过来问题。您的目标是为他们提供脚本设施,以便他们可以增强游戏。查找或定义具有所需功能的合适脚本语言的解释器,并使用它来执行脚本。例如,您可以在简单的密钥库模型中支持数据持久性,而无需为其提供文件创建访问权限。或者给他们一个命令来创建文件但确保它只接受无路径文件名。关键是要确保他们没有办法直接执行python命令。