#python #pip #dependencies #gem-fury
#питон #пип #зависимости #драгоценный камень-ярость
Вопрос:
В проекте 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?
Как вы защищаете свой код от путаницы с зависимостями? Спасибо за помощь!
Ответ №1:
В статье упоминается алгоритм, используемый pip:
- Проверяет, существует ли библиотека в указанном (внутреннем) индексе пакета
- Проверяет, существует ли библиотека в индексе общедоступного пакета (PyPI)
- Устанавливается в зависимости от найденной версии. Если пакет существует на обоих устройствах, по умолчанию он устанавливается из источника с более высоким номером версии.
Поэтому, если требуется ваш скрипт <our-other-package>>=1.2.0
, вы можете получить некоторый пакет mailicios с общедоступного сервера pypi, если он имеет более высокую версию, чем та, которую вы намеревались установить.
Простое решение, упомянутое в статье, заключается в удалении --extra-index-url
Если package 1.0
это внутренний или внешний пакет и он присутствует на частном сервере pypi, он будет загружен оттуда.
Внешние пакеты будут загружены с общедоступного сервера pypi через внутренний сервер pypi, который будет кэшировать их для дальнейшего использования.
Я бы также предложил иметь явные версии в requirements.txt , таким образом, вы знаете о версиях, которые получаете, и делаете сознательные обновления, увеличивая версии.
Подводя итог руководящим принципам (которые ни в коем случае не являются исчерпывающими и защищают от всех возможных дыр в безопасности)
- удалить
--extra-index-url https://pypi.python.org/simple
изpip.conf
,requirements.txt
и сценарии автоматизации. - укажите явные версии внутренних и внешних пакетов в requirements.txt