Python修改-防止导入危险的脚本?

Python修改-防止导入危险的脚本?,python,security,module,Python,Security,Module,我想允许用户为我的游戏制作他们自己的Python“mod”,方法是将他们的脚本放在一个特殊的文件夹中,让游戏“扫描”Python模块并导入。 防止导入“危险”脚本的最简单方法是什么?我不希望人们向我抱怨他们使用了某人的mod,并且它擦除了他们的硬盘。 我想限制的是访问/修改/创建文件夹外的任何文件,并连接到internet/下载/发送数据。如果你还想知道什么,请告诉我 那么,如何做到这一点呢?显而易见的方法是将模块作为字符串加载,然后执行它。这也有同样多的安全风险,但通过使用自定义的global

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


那么,如何做到这一点呢?

显而易见的方法是将模块作为字符串加载,然后执行它。这也有同样多的安全风险,但通过使用自定义的
globals
locals
可能更容易阻止。看一看——它在这方面提供了一些非常好的指导。正如德尔南在评论中指出的那样,这并不是完全安全的


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

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

cPython中有一个安全执行的内核。其基本思想是替换
\uuuuuuuuuuuuuuuuuu
全局(注意:不是
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
模块),该模块通知python打开一些安全特性;使某些对象上的一些属性不可访问,并在计算代码位时从解释器中删除大部分实现对象

然后需要编写一个实际的实现;这样,受保护的模块就不会泄漏到沙箱中。在链接的博客中。了解这一点可能会让你了解这个问题有多复杂



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

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


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

受限python似乎能够以干净的方式限制代码的功能,并与python兼容到2.7

e、 g

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


没有简单的方法可以提供合理数量的沙盒。特别是当文件需要一定数量的磁盘访问时。那么有什么困难的方法呢?我认为至少有一种方法可以防止将来导入特定模块。pypy提供了更复杂的沙盒,但我没有关于如何将其嵌入的信息pypy不是一个选项,因为游戏引擎需要官方的python版本,对不起。您可以通过使用权限处理磁盘访问漏洞吗?例如,当用户安装游戏时,创建一个只允许读取/修改游戏目录中文件的帐户,并使所有扩展在该帐户上运行?请注意,这将导致错误ely会让恶意修改者的事情变得更难一些。这绝不是一个全面的沙盒。@delnan:正确。我会把它添加到我的答案中。@user975135:
execfile('modscript.py',custom_globals,custom_locals)
其中
custom_globals
custom_locals
是命令。阅读链接。