【问题标题】:Avoiding dependency confusion in python避免python中的依赖混淆
【发布时间】:2021-05-20 08:22:55
【问题描述】:
在我在工作场所从事的 python 项目中,我们使用标准需求文件安装一些来自 PyPI 的包和一些来自 Gemfury 的私人公司包。
阅读本文后:https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610。
我们的需求文件看起来像这样:
--index-url <OUR_GEMFURY_URL>
--extra-index-url https://pypi.python.org/simple
aiohttp==3.7.1
simplejson==3.17.1
<our-package>==1.0.0
<our-other-package>==1.2.0
我尝试阅读一些 pip 的文档,但我无法完全理解它如何选择从何处下载包。
例如,如果有人将恶意版本 1.0.0 上传到 pypi-prod 会发生什么 - pip 如何知道要使用哪个包?
有没有办法指定 pip 为特定包只在 --index-url 中搜索它?
如何防止代码中的依赖混淆?
感谢您的帮助!
【问题讨论】:
标签:
python
pip
dependencies
gem-fury
【解决方案1】:
文章中提到了pip使用的算法:
- 检查指定(内部)包上是否存在库
索引
- 检查公共包索引 (PyPI) 上是否存在库
- 安装找到的任何版本。如果包在两者上都存在,则默认从具有更高版本号的源安装。
因此,如果您的脚本需要<our-other-package>>=1.2.0,您可以从公共 pypi 服务器获取一些 mailicios 包,前提是它的版本高于您打算安装的版本。
文章中提到的直截了当的解决方案是删除--extra-index-url
如果package 1.0 是内部或外部包,并且存在于私有 pypi 服务器中,它将从那里下载。
外部包将通过内部 pypi 服务器从公共 pypi 服务器下载,内部 pypi 服务器将缓存它们以供将来使用。
我还建议在 requirements.txt 中包含明确的版本,这样您就可以了解您获得的版本并通过增加版本来进行有意识的升级。
总结指南(绝不是详尽无遗并防止所有可能的安全漏洞)
- 从
pip.conf、requirements.txt 和自动化脚本中删除--extra-index-url https://pypi.python.org/simple。
- 在 requirements.txt 中指定内部和外部包的显式版本