Введение
Одобренные версии BenchTicket известны, но дистрибутив с теми же именем и версией может содержать иной код. Это независимое окружение содержит правильный источник, управляемые подмены и отдельный каталог одобрения.
Настройте рецепт на приём точных одобренных байтов, отказ от изменений прямых или косвенных зависимостей и работу с законным зеркалом. Команды продолжают первый пошаговый лабораторный практикум. Все wheel синтетические; публичные сервисы пакетов и эксплуатация уязвимостей не используются.
Убедитесь, что метки версии недостаточно
Сравните правильный пример с подменой той же версии. Начните в Terminal:
cd /home/labex/project/ticket-build
/opt/labex-lookalike/demo
Нормальный итог T101 — 3200,32.00. Требования уже фиксируют prices 1.4.0 и labels 1.0.0. Установщик принимает целевое окружение и каталог wheel. --no-index отключает поиск в индексах; --find-links ищет в переданном каталоге.
Создайте одноразовое демонстрационное окружение:
python3 -m venv --without-pip .trial
bash install.sh .trial '/opt/labex-lookalike/sources/changed direct'
Кавычки сохраняют пробелы в одном аргументе пути. Обе версии по-прежнему соответствуют каталогу:
python3 -m pip --isolated --python .trial show benchticket-prices benchticket-labels
.trial/bin/python quote.py orders.csv
Теперь T101 стоит 3300,33.00. Предоставленная подмена имеет корректную структуру wheel и неизменные метаданные; отличается лишь код. Имя и версия не зафиксировали ожидаемые байты.
Сравните байты кандидата с независимым одобрением
Отличите измерение файла от его одобрения. SHA-256 даёт дайджест точных байтов; иной дайджест означает иной файл.
Прочитайте отдельно предоставленный каталог:
cat /opt/labex-lookalike/approval/packages.tsv
pip hash измеряет wheel. Измерьте одобренный файл:
python3 -m pip hash /opt/labex-lookalike/sources/approved/benchticket_prices-1.4.0-py3-none-any.whl
Дайджест совпадает с каталогом. Измерьте одноимённую подмену:
python3 -m pip hash '/opt/labex-lookalike/sources/changed direct/benchticket_prices-1.4.0-py3-none-any.whl'
Дайджест отличается. Вычисление нового хеша не одобряет подмену. Учебное допущение: независимый от проекта каталог получен через доверенный канал проверки; сами хеши не определяют издателя.
Нужно ограничить и prices, и labels. Иначе изменённая косвенная зависимость изменит отображаемую сумму даже при неизменном prices.
Ограничьте весь набор зависимостей
Сохраните проверенные байты как требования pip. Версию и значение --hash=sha256: держите на одной строке:
cat > requirements.txt <<'EOF'
benchticket-prices==1.4.0 --hash=sha256:db50f7ff915dcc6cbdbf5b0afe2be55849ee70a8c7b55c44b1b3dab5deb806f9
benchticket-labels==1.0.0 --hash=sha256:3b3d881be08017aee54a825aaf3da158cd0b00b69f6d3f89744e8473f879baef
EOF
--require-hashes требует фиксированные версии и хеши всего набора, включая косвенные пакеты. --force-reinstall заменяет уже установленный пакет той же версии, чтобы предыдущую пробу нельзя было принять за чистую проверку.
cat > install.sh <<'EOF'
#!/bin/bash
set -e
python3 -m pip --isolated --python "$1" install --force-reinstall --require-hashes --no-cache-dir --no-index --find-links "$2" -r requirements.txt
EOF
Оставьте requirements.txt относительным к текущему каталогу проекта: так оба файла можно перенести вместе. Цели принадлежат вызывающему пользователю; sudo не нужен. Сохраните кавычки у обоих аргументов: первый выбирает окружение, второй — предоставленный каталог wheel. Рецепт должен действительно использовать второй каталог, не подставляя незаметно иной источник. Он должен принимать любую предоставленную копию одобренных wheel и отвергать изменённые байты.
Опечатка в хеше должна остановить установку. Сверьте с независимым каталогом и исправьте требование; не заменяйте одобрение дайджестом из отвергнутого кандидата.
Соберите и передайте одобренные цены
Примените исправленный рецепт в основном окружении. Создайте его отдельно от предыдущей пробы:
python3 -m venv --without-pip .venv
bash install.sh .venv /opt/labex-lookalike/sources/approved
Оба одобренных пакета должны установиться. Создайте реальный результат:
.venv/bin/python quote.py orders.csv --output handover.csv
cat handover.csv
Ожидайте исходные ID и количества с итогами 3200, 1200, 1600, 0 и 4200 центов. Проверьте весь файл:
diff -u /opt/labex-lookalike/approval/reference.csv handover.csv
Нет вывода — совпадение. Проверяются и расчёты, и подписи; две установленные версии не обнаружили бы изменение кода. Если раньше случайно установили другие байты, принудительная переустановка из одобренного источника восстановит одобренный код. Не меняйте исходную программу и заказы.
Отклоните изменённую косвенную зависимость
Проверьте отказ без повреждения рабочего прайс-листа. Каталог changed indirect содержит одобренный prices, но подменённый labels той же версии.
python3 -m venv --without-pip .blocked
Следующая установка должна завершиться ошибкой несовпадения хеша с кодом 1:
bash install.sh .blocked '/opt/labex-lookalike/sources/changed indirect'
Pip сообщает THESE PACKAGES DO NOT MATCH THE HASHES и показывает ожидаемый и полученный дайджест labels. Сразу прочитайте исходный код завершения:
echo $?
Ожидайте 1. Сбой соединения, отсутствие пути или интерпретатора — другие ошибки, не доказательство отказа по хешу. При опечатке пути вернитесь в ticket-build, просмотрите содержимое через ls и повторите одноразовую пробу.
Неудачная установка может оставить неполное окружение .blocked; оно не является результатом для передачи. Рабочие .venv и handover.csv должны оставаться доступными:
.venv/bin/python quote.py orders.csv
Ожидайте пять правильных строк. Никогда не ослабляйте доверенный список хешей ради установки отвергнутого источника.
Примите неизменённое зеркало
Докажите, что рецепт разрешает законные сборки. Зеркало — другое расположение тех же одобренных файлов; пробелы в пути проверяют аргументы в кавычках.
python3 -m venv --without-pip '.mirror environment'
bash install.sh '.mirror environment' '/opt/labex-lookalike/sources/approved mirror'
'.mirror environment/bin/python' quote.py orders.csv
Снова ожидайте пять правильных заказов. Отказ от всех источников, игнорирование аргумента источника или зависимость от готового окружения не выполняют контракт.
Передаются сохранённый рецепт, полные требования с хешами, реальное основное окружение и правильный handover.csv. Пробные окружения нужны лишь для управляемых демонстраций. Новая зависимость или одобренный выпуск требуют новой проверки байтов; автоматическое добавление любого сообщённого источником хеша убрало бы защиту.
Упражнение устанавливает границу для предоставленных исходных wheel. Оно не доказывает отсутствие уязвимостей в одобренном пакете или воспроизводимость всей сборки на каждой платформе.
Резюме
Вы отделили метаданные версии от точных байтов дистрибутива, ограничили прямые и косвенные зависимости и отклонили подмены той же версии. Исходный билетный инструмент по-прежнему правильно обрабатывает все заказы, а неизменённое зеркало доступно. Основа доверия — независимый каталог; кандидат не одобряет себя сам.



