我正在使用的这段代码应该根据其名称导入内部模块。模块的名称由外部源提供,因此无法信任。
def import_module_from_name( name ):
# will raise an ImportError if the module does not exist
module = __import__( modulename )
filename = module.__file__
if "<internal_path>" in filename: # check if the module can be loaded
return module
raise ImportError # the module exists but must not be loaded from here
如果出于某些原因我们的PYTHONPATH
中有恶意包,__import__( modulename )
会执行它。例如:
$> echo "print 'Got u'" > /usr/lib/python/site-packages/malicious_package/__init__.py
$> python
>>> import_module_from_name( "malicious_package" )
Got u
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in import_module_from_name
ImportError
我知道大多数常用软件包都有一条if __name__ == "__main__"
指令,以避免在导入代码时执行任何代码,而这正是恶意软件包在这种情况下无法实现的。< / p>
现在,考虑到我们拒绝在我们的PYTHONPATH
中安装恶意程序包的任何可能性(是的,我知道这是一个非常大的假设...),您是否知道以及已知的和广泛安装的包,import
在这种情况下可能会出现意外行为? (我只是希望有一个非常简单的证据证明我们需要尽快重写这个东西)
您是否看到另一种方法来检查我们要加载的模块是否在可信路径中而不导入它并且没有处理可信模块的详尽列表?