15 мая 2023

🐍 Проверка подлинности: как убедиться, что ваш код Python работает без ошибок и уязвимостей

iOS-developer, ИТ-переводчица, пишу статьи и гайды.
Из этой статьи вы узнаете критерии, по которым можно оценить качество пакетов Python и способы избежать загрузки вредоносного кода в свой проект.
🐍 Проверка подлинности: как убедиться, что ваш код Python работает без ошибок и уязвимостей
Данная статья является переводом. Автор: Philipp Acsany. Ссылка на оригинал.

Для установки пакетов с помощью Python достаточно одной команды pip install. Это одно из многих замечательных свойств, которые может предложить экосистема Python.

Однако, возможно, вы когда-то загрузили сторонний пакет, который так или иначе вам не подошел. Например, пакет не поддерживал версию Python, которую вы использовали в своем проекте, или пакет не делал того, что вы ожидали.

Поняв, как можно отличить высококачественный пакета Python, вы сможете избежать внедрения несовместимого или даже вредоносного кода в свой проект. В этом руководстве вы узнаете, как индекс пакетов Python может помочь составить вам первое впечатление о пакете. Затем вы копнете еще глубже, проверив Libraries.io, репозиторий GitHub и лицензию на любой пакет Python, который вы хотите использовать.

В конце концов, вы узнаете, как оценивать сторонние пакеты, которые вы можете найти в интернете, прежде чем внедрять их в свои проекты Python.

Для дальнейшего использования вы также можете загрузить эту удобную блок-схему, которая поможет вам решить, подходит ли сторонний пакет Python для вашей конкретной ситуации: Бонусная загрузка: щелкните здесь, чтобы загрузить бесплатную блок-схему, которую вы можете использовать для оценки качества пакетов Python.

Как оценить качество сторонних пакетов Python

Индекс пакетов Python (PyPI) содержит самую большую коллекцию внешних пакетов Python. Прежде чем устанавливать пакет с помощью pip, убедитесь, что он доступен в PyPI:

🐍 Проверка подлинности: как убедиться, что ваш код Python работает без ошибок и уязвимостей

Данное изображение и все последующие взяты отсюда.

Возможность найти пакет в PyPI является хорошим показателем того, что он подлинный, хотя вам все равно нужно быть осторожным.

Примечание
Посредством pip install можно получить пакет из репозитория Git или напрямую установить Python wheel, которое вы можете найти в Интернете.

Хотя вы можете загрузить пакет Python из любого места, вы должны спросить себя, является ли пакет высококачественным и безопасным.

В PyPI у вас есть возможность просматривать категории или искать ключевые слова. Если вы не ищете очень нишевый пакет, скорее всего, PyPI предоставит вам список из тысяч пакетов, соответствующих вашей теме.

Чтобы отсортировать порядок списка, PyPI предлагает вам два варианта:

  1. Релевантность.
  2. Дата последнего обновления.

Вариант сортировки по релевантности неоднозначен, потому что вы не знаете, по какому принципу PyPI проводит сортировку. Когда вы сортируете по релевантности, пакеты, появляющиеся вверху, действительно часто соответствуют вашим потребностям:

Иногда может быть сложно найти нужный пакет в PyPI, даже если вы знаете имя пакета. Например, если вы ищете beautiful soup, вы получите ряд похожих результатов. Вот когда сортировка по релевантности может пригодиться.

Из любопытства вы также можете заглянуть в пакеты, которые были обновлены в последнее время, используя сортировку по дате последнего заказа. Но обычно сортировка приводит к тому, что нерелевантные пакеты появляются сверху только потому, что они были недавно обновлены.

В большинстве случаев пакету не нужно быть передовым, если он не решает проблемы безопасности. Вместо этого важно, чтобы пакет поддерживал Python-версию вашего проекта. Вот тут-то и вступает в игру фильтр PyPI:

Например, если вы хотите в полной мере использовать классные новые функции Python 3.11, вы можете в фильтрах в языках программирования выбрать Python 3.11.

Кроме того, вы можете комбинировать фильтры в PyPI. Рекомендуется также учитывать статус разработки, отфильтровав также Production/Stabl. Таким образом, вы увеличиваете шансы на работу с надежными пакетами, прошедшими тщательное тестирование.

Когда вы найдете пакет, который, кажется, соответствует вашим потребностям, необходимо будет время рассмотреть его тщательнее, чтобы убедиться, что он безопасен и надежен. Для этой оценки изучите страницу сведений о PyPI. Щелкнув на имя пакета, вы попадете на страницу, посвященную этому пакету:

На странице сведений о пакете PyPI вы найдете самую важную информацию о пакете:

  • Описание проекта.
  • Поддерживаемые версии Python.
  • История релизов.
  • Ссылки на проекты.
  • Статистика GitHub.
  • Информация о лицензии.
  • Сведения об авторе.

В зависимости от проекта Python, в который нужно добавить пакет, некоторые части информации могут быть более важными, чем другие. Вы всегда должны следить за тем, чтобы описание проекта было продуманным. В идеале вы получите полезное введение в пакет и найдете шаги по началу работы с пакетом, а также несколько примеров кода.

Примечание
Любой сторонний пакет, который стоит рассмотреть, должен иметь ссылку проекта на исходный код проекта. Это также хороший показатель качества пакета, когда существует онлайн-документация и даже веб-сайт проекта.

Еще одним косвенным показателем качества пакета может быть его автор. Вы можете предпочесть использовать пакет от известной фигуры в сообществе Python, а не пакет от анонимного человека с учетной записью с именем вроде asdf123. Когда вы наводите курсор на имя автора, вы можете убедиться, что адрес электронной почты автора пакета действителен:

🐍 Проверка подлинности: как убедиться, что ваш код Python работает без ошибок и уязвимостей

На боковой панели сведений о пакете рядом со сведениями об авторе вы найдете статистику о пакете. Наиболее заметными являются статистические данные GitHub, которые вы вскоре изучите. Они немного скрыты, но вы также найдете ссылку на другую платформу, которая дает вам ценную информацию о качестве внешних пакетов Python. Далее вы рассмотрите эту платформу.

Использование Libraries.io

На странице сведений о PyPI пакета вы можете найти ссылку для просмотра статистики проекта на Libraries.io. Если вы ищете высококачественные пакеты Python, то Libraries.io отлично поможет вам в этом:

Помощь разработчикам в принятии более быстрых и обоснованных решений об используемом программном обеспечении.

Но не только разработчики Python извлекают выгоду из своей затеи. Libraries.io отслеживает пакеты на нескольких языках программирования, включая JavaScript и Java.

Когда вы переходите по ссылке со страницы сведений о PyPI на Libraries.io, вы видите страницу, которая на первый взгляд похожа на страницу сведений о PyPI:

🐍 Проверка подлинности: как убедиться, что ваш код Python работает без ошибок и уязвимостей

Если вы внимательно посмотрите на страницу сведений Libraries.io, то сможете найти ценную информацию о пакете, который PyPI не показывает. Хотя статистика поступает из PyPI, вам потребуется доступ к набору данных PyPI API, чтобы получить данные.

На Libraries.io также доступны другие ценные данные, такие как:

  • Зависимые пакеты.
  • Первый релиз.
  • Участники проекта.

Если первый релиз пакета был выпущен много лет назад, но пакет все еще находится в разработке, то он, вероятно, уже устарел. Это особенно верно, когда многие участники объединили свои усилия для создания пакета.

Разработка пакета, который становится обязательным для других, является почетным знаком для каждого, кто публикует пакет на PyPI. Большое количество зависимых пакетов показывает, что другие разработчики доверяют этому пакету. Чтобы их пакеты работали корректно, они полагаются на то, что данный пакет установлен.

На Libraries.io вы можете найти еще один интересный тест качества сторонних пакетов Python – SourceRank. SourceRank — это собственная оценка, которую Libraries.io присваивает пакетам на основе нескольких показателей. Взглянув на метрики, вы получите еще один контрольный список, который вы можете принять во внимание при оценке пакетов Python:

🐍 Проверка подлинности: как убедиться, что ваш код Python работает без ошибок и уязвимостей

SourceRank сообщает, что пакету folium можно доверять. У него был недавний релиз, он не совсем новый, и более сотни пакетов используют его в качестве зависимости, хотя он еще не достиг версии 1.0.

В списке SourceRank вы видите некоторые перечисленные факторы, которые вы уже видели в PyPI. Многие из них ссылаются на репозиторий Git, где размещен исходный код пакета. Итак, это следующий ориентир, на который стоит взглянуть поближе.

Исследуйте репозиторий GitHub

Репозиторий стороннего пакета на GitHub показывает, насколько активна его разработка. Вы можете зайти в репозиторий и самостоятельно изучить исходный код или просмотреть проблемы, чтобы узнать, как другие разработчики используют пакет.

Если у вас есть свободное время, изучение исходного кода — отличный способ оценить качество пакета Python. Чтение чужого кода Python также помогает в изучении Python.

Но причина, по которой вы хотите использовать внешний пакет, может заключаться в том, что вы не разбираетесь в этой конкретной области. Здесь и пригождаются социально значимые пакеты Python. На GitHub вы можете увидеть, насколько другие увлечены проектом. Некоторые из показателей показывают количество:

  • Наблюдателей: люди, которые решили получать уведомления об активности репозитория.
  • Звезд: способ, с помощью которого пользователи могут добавлять в закладки или лайкать репозиторий, чтобы отслеживать его.
  • Форки: копии репозитория, которые кто-то создал для внесения изменений, не затрагивая исходную кодовую базу.
  • Pull request: предлагаемые изменения в репозитории, которые участник отправил для проверки и возможного слияния с основной кодовой базой.
  • Issue: способ для пользователей сообщать о проблемах или предлагать новые функции для репозитория, которые затем могут решить участники или сопровождающие.

Большое количество наблюдателей и звездочек означает, что другие люди интересуются репозиторием Git. Количество ответвлений указывает, сколько разработчиков скопировали репозиторий пакета, чтобы поэкспериментировать с исходным кодом. В большинстве проектов с открытым исходным кодом другие разработчики пишут свои дополнения к пакету внутри своих собственных ответвлений.

Большое количество запросов на включение означает, что многие разработчики хотят внести свой вклад в проект. Это хороший показатель. Но просмотр одних только цифр обычно не дает полной картины:

На видео выше видно, что репозиторий Django на GitHub имеет 145 открытых и более 16 000 закрытых запросов на пулл реквест, 8 000 из которых были объединены в проект. На момент написания некоторые из них были закрыты и объединены всего несколько часов назад. Эти метрики показывают, что Django является популярным, активно поддерживаемым проектом и может идеально подойти, если вы хотите создать веб-приложение с карточками или создать приложение для управления списками дел с помощью Python.

Когда вы просматриваете детали запросов на пулл реквест репозитория GitHub, вы часто можете заметить конструктивное обсуждение темы и увидеть, как разработчики помогают друг другу улучшать исходный код.

Тем не менее другие пакеты могут иметь большое количество необъединенных запросов на пулл реквест. Проект с большим количеством открытых запросов на вытягивание может указывать на то, что основные разработчики не отслеживают активно и не внедряют изменения от внешних участников. Однако это не обязательно плохой знак. Вместо этого стоит дополнительно изучить, как выглядит обсуждение запросов на пулл реквест или сколько запросов было объединено в прошлом.

То же самое касается issues. Вместо того чтобы просто смотреть на количество проблем, посмотрите на темы проблем и качество разговоров. Узнайте, почему вопросы могут оставаться открытыми или почему вопросы были закрыты.

Примечание
Если вас беспокоят особенности пакета, хорошей идеей будет поиск ключевых слов в открытых и закрытых проблемах GitHub. Другие разработчики, возможно, искали информацию у авторов пакета и использовали функциональность проблемы GitHub, чтобы задать вопросы.

И последнее, но не менее важное: обратите внимание на файл README в репозитории. Подобно странице сведений о пакете PyPI, файл README является отличным индикатором того, насколько тщательно участники вложились в пакет. Хорошо написанный файл README с полезной информацией для вас как пользователя — это всегда хороший знак. Это показывает, что участники заботятся о документировании своего пакета.

Когда вы помните обо всех вышеперечисленных факторах, у вас есть хорошие шансы найти высококачественные пакеты Python. Даже если исходный код пакета соответствует вашим потребностям, прикрепленная лицензия может не соответствовать, тогда проверим ее следующим шагом.

Ознакомьтесь с лицензией

В зависимости от того, как вы хотите использовать пакет Python, вы можете внимательно изучить лицензию пакета. Даже если пакет с открытым исходным кодом и бесплатен для использования, к нему могут быть приложены условия. Лицензия охватывает три аспекта:

  1. Разрешения: разрешенное использование кода, например, его использование в коммерческих или некоммерческих целях, изменение кода или его распространение в составе собственного пакета.
  2. Условия: требования, которые необходимо выполнить для использования кода, например включение уведомления об авторских правах или предоставление копии лицензии вместе с кодом.
  3. Ограничения: ограничения на то, что вы можете делать с кодом — например, не использовать его в незаконных целях или не заявлять, что вы написали код.

Для личных проектов вам обычно подходит большинство лицензий на внешние пакеты с открытым исходным кодом. Это особенно верно, когда вы запускаете свой код только локально на своем компьютере.

Когда вы делитесь своим проектом с другими, вам необходимо проверить прилагаемую лицензию любых сторонних пакетов, которые вы используете. К счастью, пакеты Python обычно не поставляются с пользовательскими лицензиями. Вместо этого разработчики часто выбирают одну из популярных лицензий с открытым исходным кодом.

Дополнительную информацию о лицензии, которую использует пакет, можно найти на боковой панели страницы сведений о PyPI:

🐍 Проверка подлинности: как убедиться, что ваш код Python работает без ошибок и уязвимостей

Когда вы используете сторонний пакет в коммерческих условиях, важно выбрать пакет с надлежащей лицензией. В этом случае рекомендуется отфильтровать поиск PyPI, используя вариант лицензии.

Когда вы выполнили все вышеперечисленные шаги и лицензия пакета соответствует вашим потребностям, вы почти готовы к работе. Но прежде чем устанавливать внешний пакет, ознакомьтесь с несколькими предостережениями в следующем разделе.

Будь осторожен!

Вы должны быть осторожны с файлами, которые вы загружаете из Интернета. Точно так же вы не должны внедрять какие-либо внешние пакеты в свой код, не убедившись, что вы можете доверять источнику.

Примечание
Даже если вы следуете рекомендациям по работе с виртуальной средой, пакеты Python могут получать доступ к другим частям вашей операционной системы за пределами папки вашего проекта.

К настоящему моменту вы узнали основные меры для проверки того, что вы работаете с высококачественными пакетами в своем коде. У вас может быть даже несколько пакетов, которым вы можете доверять, потому что вы успешно с ними работали.

Рекомендуется время от времени проверять веб-сайты их проектов. Даже незначительные изменения версии проекта могут привести к ошибкам в вашем проекте, которых вы не ожидали.

Если вы будете в курсе разработки ваших доверенных пакетов, вы будете знать, что может сломаться при обновлении. В этом случае вы можете безопасно использовать более старую рабочую версию.

Знание того, каким внешним пакетам вы можете доверять, является большим достижением для вас как разработчика Python. Но даже если вы знаете названия пакетов наизусть, будьте внимательны при их установке.

Есть шанс, что вы сделаете опечатку в своей команде pip. Злоумышленники могут использовать эту возможность, давая своим пакетам имена, имитирующие популярные пакеты. Вот некоторые детали, на которые следует обратить внимание, и которые вы более подробно изучите ниже:

  • Используйте правильный номер в имени пакета.
  • Проверьте, является ли имя пакета единственным или множественным.
  • Остерегайтесь опечаток.

Некоторые пакеты Python содержат число в своем имени. Часто это номера версий, которые сопровождающие решили внедрить в имя пакета, чтобы отличить пакет от более старой версии. В то время как это может иметь смысл для некоторых, другие могут быть сбиты с толку числом.

Например, при работе с шаблонами Jinja в Python 3 вы можете случайно ввести Jinja3 вместо правильной версии Jinja2.

Другой неудачей может быть ввод имени пакета в форме существительного единственного числа вместо множественного числа. Например, вы используете request без s в конце вашей pip-команды вместо того, чтобы использовать правильное имя requests. В этом случае все тщательные исследования, которые вы провели для библиотеки Python, requests, оказались напрасными.

Возможны опечатки, особенно если вам нужно ввести pip-команду для пакетов с длинными именами. Пакет Beautiful Soup, как известно, подвержен опечаткам. Подумайте обо всех местах, где вы можете ошибиться при наборе текста beautifulsoup4.

Злоумышленники могут загружать пакеты, в которых они поменяли местами две буквы или заменили одну на соседнюю букву на клавиатуре. Эта техника имитации известна как типосквоттинг. Некоторые пакеты могут считаться вредоносными программами и не должны попадать в вашу систему.

Чаще всего pip не сможет найти ошибочный пакет, или вы просто получите не тот пакет, который искали. Тем не менее есть вероятность, что кто-то с плохими намерениями загрузил пакет с похожим звучанием. Если вы хотите подстраховаться, то лучше скопировать и вставить название непосредственно из PyPI, чтобы избежать опечаток.

Примечание
Знание — сила, поэтому рекомендуется следить за сообщениями о вредоносных пакетах на PyPI или GitHub. Если вы хотите быть в курсе, вы можете послушать подкаст Real Python. В эпизоде ​​134 можно найти комментарий о подозрительных пакетах на PyPI. Несколькими неделями ранее были сообщения о вредоносных пакетах Python в эпизоде ​​122.

Чтобы получить представление о PyPI изнутри, вы можете прослушать эпизод 377 подкаста Talk Python To Me. В этом выпуске Дастин Инграм делится некоторыми мыслями о своей работе в качестве одного из сопроводителей PyPI.

Даже установка нужного пакета по доброй воле может быть опасна, если злоумышленнику удалось получить контроль над проектом автора. Так что стоит быть начеку и обращать внимание на любые подозрительные изменения в поведении пакетов.

Если вы когда-нибудь обнаружите вредоносный пакет в PyPI, вы можете сообщить о проблеме службе безопасности. PyPI очень серьезно относится к безопасности и обычно принимает меры после любых сообщений. Однако, чтобы не раскрывать злоумышленникам какие-либо внутренние методы, команда безопасности PyPI часто хранит молчание о своих операциях. Таким образом, вы можете или не можете быть в курсе любых последующих действий, если вы сообщите о подозрительном пакете.

Тем не менее сообщать о любом подозрительном пакете — хорошая идея! Таким образом, каждый пользователь Python может принять участие в поддержании чистоты среды Python.

Заключение

Когда вы используете сторонние пакеты Python, вы работаете с внешним программным обеспечением, которое кто-то еще разместил в Интернете. Точно так же, как вы не должны загружать любой старый файл из Интернета, вы не должны устанавливать внешние пакеты, не проверив их предварительно.

Прежде чем устанавливать пакеты с помощью pip, вы должны задать себе следующие вопросы:

  • Поддерживает ли пакет версию Python, с которой вы работаете?
  • Насколько популярен пакет?
  • Хорошо ли поддерживается кодовая база пакета?
  • Другие пакеты полагаются на этот пакет?
  • Соответствует ли лицензия пакета вашим потребностям?
  • Какая точная команда pip install для пакета?

Любой сторонний пакет, который стоит рассмотреть, должен быть на PyPI со страницей подробной информации и ссылкой на исходный код проекта. Это также хороший показатель, когда вы можете найти онлайн-документацию и даже веб-сайт проекта.

***

Материалы по теме

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»

Источники

МЕРОПРИЯТИЯ

Как вы проверяете подлинность пакетов Python?

ВАКАНСИИ

Добавить вакансию
Backend Lead (Python, Django)
по итогам собеседования
DevOps
от 350000 RUB
C# Developer
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ