繁体   English   中英

避免 python 中的依赖混淆

[英]Avoiding dependency confusion in 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 的文档,但我无法完全理解它如何选择从哪里下载 package。 例如,如果有人将恶意版本 1.0.0 上传到 pypi-prod 会发生什么 - pip 怎么知道要使用哪个包? 有没有办法为特定的 package 指定 pip 以仅在 --index-url 中搜索它?

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

文章提到算法 pip 使用:

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

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

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

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

外部包将通过内部 pypi 服务器从公共 pypi 服务器下载,内部 pypi 服务器将缓存它们以供将来使用。

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

总结指南(绝不是详尽的并防止所有可能的安全漏洞)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM