2013-03-13 68 views
7

如果我的代码使用的是不能信任的第三方模块,还有什么来防止这样的情况:由第三方代码被损坏保护导入模块

UntrustedModule.py:

import random 

random.random = lambda : 4 

MyModule的.py:

import random 
import UntrustedModule 

print (random.random()) 

只需导入此模块就可以打破其他不相关的假设?

+6

不受信任的模块可以做更多,只是替换功能等。不要运行不受信任的模块。 – 2013-03-13 12:36:10

+2

该修改看起来很好(请参阅http://xkcd.com/221/)。 ;) – Matthias 2013-03-13 12:50:07

+0

Python并不是真正旨在防止这种情况。如果这是一项要求,最好使用(如Lua或Javascript)的语言,或创建一个在另一个进程中运行模块的沙箱模式。 – millimoose 2013-03-13 12:50:37

回答

5

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

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


PyPy实现了一些sandboxing features。这不像“转向沙盒”那么简单,但它是隔离不可信代码的众多方法之一。

-1

可以为了从源头RESP重新加载它做

reload(random) 

。按照它的意图恢复它。

+0

这个答案有什么问题? – glglgl 2013-03-13 12:56:16

+0

我认为担心安全问题被忽视,因为OP在谈论“不可信代码”。 – 2013-03-13 13:18:45

+0

(不可信的代码可能会插入导入机器本身,并使重新加载无用) – 2013-03-13 13:20:06

-1

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

更好的解决方案是检查和写入不可信模块的测试。

+2

“更好的解决方案是检查和写入不可信模块的测试。” - 不是真的。这意味着你打赌你比潜在的攻击者更聪明。 – millimoose 2013-03-13 12:51:44

+0

@millimoose:因此检查来了。如果模块真的不可信,那么最好不要使用。 – 2013-03-13 13:44:42