保护导入的模块不被第三方代码损坏

时间:2013-03-13 12:30:13

标签: python

如果我的代码使用了不可信任的第三方模块,那么有什么可以阻止这样的情况:

UntrustedModule.py:

import random

random.random = lambda : 4

MyModule.py:

import random
import UntrustedModule

print (random.random())

只是导入这个模块会打破其他无关的假设吗?

3 个答案:

答案 0 :(得分:5)

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

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


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

答案 1 :(得分:-1)

你可以做一个

reload(random)

为了从源代码重新加载它。按原样恢复它。

答案 2 :(得分:-1)

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

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