深入研究Python site.py
documentation后,发现与.pth
文件有关:
空白行和以#开头的行将被跳过。将执行以import开头的行(后跟空格或制表符)。
这两个句子很容易遗漏。它们位于长篇段落的结尾,这意味着扫描眼睛很容易忽略它们。即使我一直在积极寻找他们,我也很想念他们。
代码执行的示例来自python3.6/site-packages/virtualenvwrapper-4.8.2-py2.7-nspkg.pth
:
import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('virtualenvwrapper',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('virtualenvwrapper', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('virtualenvwrapper', [os.path.dirname(p)])));m = m or sys.modules.setdefault('virtualenvwrapper', types.ModuleType('virtualenvwrapper'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)
允许在.pth
文件中执行任意代码的目的是什么?
鉴于任意执行代码都会带来广泛的负面影响,关于检查或保护.pth
文件的最佳实践是什么?
答案 0 :(得分:2)
允许在.pth文件中执行任意代码的目的是什么?
它允许程序包使用代码配置sys.path
。这可以用于条件分支,例如平台特定的自定义。
鉴于任意代码执行会产生广泛的负面影响,关于检查或保护.pth文件的最佳实践是什么?
一如既往-了解您要安装的内容。使用pip install somepackage
已经允许任意代码执行,setup.py
作为代码执行。因此,实际上没有任何其他漏洞或可能性可以将代码隐藏在.pth
文件中。
最近一直在讨论是否可以弃用和删除.pth
hacks(Python 3.8+),有关更多详细信息,请参见issue33944。