【问题标题】:Python modding - prevent dangerous scripts to be imported?Python modding - 防止导入危险脚本?
【发布时间】:2012-04-02 19:50:27
【问题描述】:

我希望允许用户为我的游戏制作他们自己的 Python“模组”,方法是将他们的脚本放置在游戏“扫描”Python 模块和导入的特殊文件夹中。 防止导入“危险”脚本的最简单方法是什么?我不希望人们向我抱怨他们使用了某人的 mod 并且它擦除了他们的硬盘驱动器。 我想限制的事情是访问/修改/创建其文件夹之外的任何文件并连接到互联网/下载/发送数据。如果您能想到其他任何事情,请告诉我。

那么如何做到这一点呢?

【问题讨论】:

  • 没有简单的方法来提供合理数量的沙盒。 特别是如果文件需要一定数量的磁盘访问。
  • 那么困难的方法是什么?我认为至少有一种方法可以防止将来导入特定的模块。
  • pypy 提供更复杂的沙盒,但我不知道如何将它嵌入到您的游戏中。
  • pypy 不是一个选项,因为游戏引擎需要官方 python 版本,对不起。
  • 你能通过使用权限来处理磁盘访问漏洞吗?例如,当用户安装您的游戏时,创建一个只允许读取/修改游戏目录中文件的帐户,并使所有扩展都在该帐户上运行?

标签: python security module


【解决方案1】:

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

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

例如

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 请注意,这只会让恶意修改者的事情变得更加困难。它绝不是一个全面的沙盒。
    • @delnan:正确。我会将其添加到我的答案中。
    • @user975135: execfile('modscript.py', custom_globals, custom_locals) 其中custom_globalscustom_locals 是字典。阅读链接。
    【解决方案3】:

    沙盒化 python 执行存在一些严重的缺陷。 aquavitae 的回答链接到关于这个问题的一些很好的讨论,尤其是this blog post。请先阅读。

    cPython 中有一个安全执行内核。基本思想是替换__builtins__全局(注意:不是__builtin__模块),它通知python打开一些安全功能;使某些对象的一些属性无法访问,并在评估那段代码时从解释器中删除大部分实现对象。

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


    现在你已经明白这是python中的一个挑战;您应该看看以沙盒执行为核心功能的语言,例如在游戏中非常流行的Lua

    【讨论】:

      【解决方案4】:

      让他们执行 python 并试图限制他们的行为是自找麻烦。请参阅this SO question 进行讨论和指向一篇好文章的指针。 (您可能会禁用“eval”,但在实践中不会有太大区别。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 2021-01-19
        • 1970-01-01
        • 2016-04-07
        • 1970-01-01
        相关资源
        最近更新 更多