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

Python 保护导入的模块不被第三方代码损坏,python,Python,如果我的代码使用了不可信的第三方模块,是否有任何措施可以防止这种情况: UntrustedModule.py: import random random.random = lambda : 4 import random import UntrustedModule print (random.random()) MyModule.py: import random random.random = lambda : 4 import random import UntrustedMo

如果我的代码使用了不可信的第三方模块,是否有任何措施可以防止这种情况:

UntrustedModule.py:

import random

random.random = lambda : 4
import random
import UntrustedModule

print (random.random())
MyModule.py:

import random

random.random = lambda : 4
import random
import UntrustedModule

print (random.random())
如果只是导入此模块就打破了对其他无关模块的假设?

您可以

reload(random)

为了从源响应重新加载它。将其还原为预期状态。

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


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

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

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



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

不受信任的模块可以做更多的事情,仅仅是替换函数等等。不要运行不受信任的模块。这种修改看起来很好(请参阅)。;)Python并不是专门为防止这种情况而设计的。如果这是一项要求,您最好使用一种符合要求的语言(如Lua或Javascript),或者创建一个沙箱方案,在另一个进程中运行模块。“更好的解决方案是针对您不受信任的模块进行检查和编写测试。”-不是真的。这只意味着你打赌你比潜在的攻击者更聪明。@millimoose:所以检查就来了。如果模块是真正不可信的,那么最好不要使用。我想这是担心安全问题被忽略了,因为OP谈论的是“不可信代码”。(不可信代码可能插入导入机器本身,使重新加载变得无用)