7

如果我的代码使用了无法信任的第三方模块,有什么可以防止这种情况发生:

UntrustedModule.py:

import random

random.random = lambda : 4

我的模块.py:

import random
import UntrustedModule

print (random.random())

仅仅导入这个模块会打破对其他不相关的假设吗?

4

3 回答 3

5

不,在 Python 中你不能有任何这样的保证,至少在 CPython 实现中不能。当您导入一个模块时,它的代码会运行,并且它可以完全访问解释器的每个部分(可能还有系统的大部分)。没有办法避免这种情况。加载不受信任的代码是不明智的,因为它可以做的事情太多了。

但是,您可能有兴趣在隔离进程中运行该进程,并且仅通过 IPC 与其通信。这是一个很大的话题,它取决于您需要的隔离程度以及您对外部代码的信任程度。


PyPy 实现了一些沙盒功能。它并不像“打开沙盒”那么简单,但它是隔离不受信任代码的众多方法之一。

于 2013-03-13T12:50:00.353 回答
-1

你可以做一个

reload(random)

为了从源重新加载它。将其恢复为预期状态。

于 2013-03-13T12:36:19.623 回答
-1

Python 将按照首先搜索本地路径(执行脚本的目录)的顺序导入,然后是 PYTHONPATH 环境变量中列出的任何路径。

更好的解决方案是针对您的不受信任的模块检查和编写测试。

于 2013-03-13T12:43:44.650 回答