避免python中的依赖性混淆

2024-05-19 21:38:00 发布

您现在位置:Python中文网/ 问答频道 /正文

在我工作场所的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如何知道要获取哪一个包? 是否有一种方法可以指定特定包的topip,以便只在--index url中搜索它

如何防止代码中的依赖项混淆? 谢谢你的帮助


Tags: pip文件项目httpspypiurlpackage标准
1条回答
网友
1楼 · 发布于 2024-05-19 21:38:00

本文提到了pip使用的算法:

  • 检查指定(内部)包上是否存在库 索引
  • 检查公共包索引(PyPI)上是否存在库
  • 安装找到的任何版本。如果两者上都存在该包,则默认从版本号较高的源安装

因此,如果您的脚本需要<our-other-package>>=1.2.0,您可以从公共pypi服务器获得一些mailicios包,如果它的版本高于您打算安装的版本

文章中提到的简单解决方案是删除 extra-index-url

如果package 1.0是内部或外部包,并且存在于私有pypi服务器中,则将从那里下载

外部软件包将通过内部pypi服务器从公共pypi服务器下载,内部pypi服务器将缓存这些软件包以备将来使用

我还建议在requirements.txt中有明确的版本,这样您就可以知道您得到的版本,并通过增加版本进行有意识的升级

总结这些指南(这些指南并非详尽无遗,并防止出现所有可能的安全漏洞)

  • pip.confrequirements.txt和自动化脚本中删除 extra-index-url https://pypi.python.org/simple
  • 在requirements.txt中指定内部和外部包的显式版本

相关问题 更多 >