Introduction
Les versions approuvées de BenchTicket sont connues, mais une distribution de même nom et version peut contenir un autre code. Cet environnement indépendant contient une source correcte, des substitutions contrôlées et un catalogue d’approbation séparé.
Votre recette acceptera les octets exacts approuvés, refusera les changements directs ou indirects et restera compatible avec un miroir légitime. Les commandes s’appuient sur le premier laboratoire guidé. Tous les wheels sont synthétiques ; aucun service public ni exploitation de vulnérabilité n’intervient.
Voir pourquoi la version ne suffit pas
Comparez l’exemple correct à une substitution de même version. Commencez dans Terminal :
cd /home/labex/project/ticket-build
/opt/labex-lookalike/demo
Le montant normal T101 est 3200,32.00. Les exigences fixent déjà prices 1.4.0 et labels 1.0.0. Cet installateur accepte deux arguments : environnement cible et répertoire de wheels. --no-index désactive la recherche d’index ; --find-links recherche dans le répertoire fourni.
Créez un environnement de démonstration jetable :
python3 -m venv --without-pip .trial
bash install.sh .trial '/opt/labex-lookalike/sources/changed direct'
Les guillemets préservent les espaces de cet argument de chemin. Les deux versions correspondent toujours au catalogue :
python3 -m pip --isolated --python .trial show benchticket-prices benchticket-labels
.trial/bin/python quote.py orders.csv
T101 coûte désormais 3300,33.00. Le substitut fourni conserve une structure wheel valide et les mêmes métadonnées ; seul le code change. Nom et version ne liaient pas les octets attendus.
Comparer les octets candidats à l’approbation indépendante
Distinguez mesurer un fichier et l’approuver. SHA-256 produit une empreinte des octets exacts ; une empreinte différente signifie un fichier différent.
Lisez le catalogue fourni séparément :
cat /opt/labex-lookalike/approval/packages.tsv
pip hash mesure un wheel. Mesurez le fichier approuvé :
python3 -m pip hash /opt/labex-lookalike/sources/approved/benchticket_prices-1.4.0-py3-none-any.whl
Son empreinte correspond au catalogue. Mesurez le substitut homonyme :
python3 -m pip hash '/opt/labex-lookalike/sources/changed direct/benchticket_prices-1.4.0-py3-none-any.whl'
Cette empreinte diffère. Calculer ce nouveau hash n’approuve pas le substitut. L’hypothèse de formation est que le catalogue indépendant du projet arrive par un canal de revue fiable ; les empreintes seules n’identifient pas un éditeur.
Il faut contraindre prices et labels. Sinon, modifier une dépendance indirecte pourrait changer le montant affiché tout en laissant prices intact.
Contraindre toutes les dépendances
Enregistrez les octets examinés comme exigences pip. Gardez chaque version et sa valeur --hash=sha256: sur la même ligne :
cat > requirements.txt <<'EOF'
benchticket-prices==1.4.0 --hash=sha256:db50f7ff915dcc6cbdbf5b0afe2be55849ee70a8c7b55c44b1b3dab5deb806f9
benchticket-labels==1.0.0 --hash=sha256:3b3d881be08017aee54a825aaf3da158cd0b00b69f6d3f89744e8473f879baef
EOF
--require-hashes exige versions fixes et empreintes pour tout le graphe, y compris les paquets indirects. --force-reinstall remplace aussi un paquet déjà installé de même version : un essai antérieur ne peut ainsi passer pour une vérification vierge.
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
Gardez requirements.txt relatif au répertoire courant du projet pour déplacer ensemble les deux fichiers. Les cibles appartiennent à l’appelant ; aucun sudo n’est nécessaire. Conservez les deux arguments entre guillemets : le premier choisit l’environnement, le second le répertoire fourni. La recette doit réellement utiliser ce second répertoire sans récupérer silencieusement une autre source. Elle doit accepter toute copie fournie des wheels approuvés et refuser les octets modifiés.
Une faute dans une empreinte doit arrêter l’installation. Comparez au catalogue indépendant et corrigez l’exigence ; ne remplacez pas l’approbation par l’empreinte du candidat rejeté.
Construire et livrer les tarifs approuvés
Utilisez la recette corrigée dans l’environnement principal. Créez-le séparément de l’essai précédent :
python3 -m venv --without-pip .venv
bash install.sh .venv /opt/labex-lookalike/sources/approved
Les deux paquets approuvés doivent s’installer. Produisez la véritable livraison :
.venv/bin/python quote.py orders.csv --output handover.csv
cat handover.csv
Attendez les ID et quantités originaux avec les totaux 3200, 1200, 1600, 0 et 4200 centimes. Vérifiez tout le fichier :
diff -u /opt/labex-lookalike/approval/reference.csv handover.csv
Aucune sortie signifie correspondance. Cela teste calcul et étiquettes ; deux versions installées ne révéleraient pas du code altéré. Si une installation accidentelle utilisait des octets modifiés, la réinstallation forcée restaure le code approuvé avec la source approuvée. Préservez le programme et les commandes originaux.
Refuser une dépendance indirecte modifiée
Testez le refus sans endommager les tarifs fonctionnels. Le répertoire changed indirect contient prices approuvé mais un labels substitué de même version.
python3 -m venv --without-pip .blocked
L’installation suivante doit échouer pour empreinte incompatible, avec le code 1 :
bash install.sh .blocked '/opt/labex-lookalike/sources/changed indirect'
Pip affiche THESE PACKAGES DO NOT MATCH THE HASHES et les empreintes attendue et reçue de labels. Lisez immédiatement le code natif :
echo $?
Attendez 1. Une panne de connexion, un chemin absent ou un interpréteur manquant sont d’autres erreurs, pas une preuve du refus par empreinte. Si le chemin est mal saisi, revenez dans ticket-build, listez les éléments avec ls et répétez l’essai jetable.
L’échec peut laisser un environnement .blocked incomplet ; ce n’est pas une livraison. Votre bon .venv et handover.csv doivent rester utilisables :
.venv/bin/python quote.py orders.csv
Attendez cinq lignes correctes. N’affaiblissez jamais les empreintes fiables pour installer la source rejetée.
Accepter un miroir inchangé
Prouvez que la recette permet toujours les installations légitimes. Un miroir contient les mêmes fichiers approuvés à un autre emplacement ; son chemin comporte des espaces pour exercer les arguments entre guillemets.
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
Attendez encore les cinq commandes correctes. Refuser toutes les sources, ignorer l’argument source ou dépendre d’un environnement existant ne respecterait pas le contrat.
Livrez la recette, les exigences complètes avec empreintes, l’environnement principal réel et le bon handover.csv. Les environnements d’essai ne sont que des démonstrations contrôlées. Une dépendance ou version approuvée nouvelle nécessite une nouvelle revue des octets ; ajouter automatiquement toute empreinte annoncée par une source enlève la protection.
L’exercice établit la limite pour les wheels originaux fournis. Il ne prouve ni l’absence de vulnérabilités d’un paquet approuvé, ni la reproductibilité complète sur toutes les plateformes.
Résumé
Vous avez distingué métadonnées de version et octets exacts, contraint dépendances directes et indirectes et refusé les substitutions de même version. L’outil original produit toujours toutes les commandes correctes et un miroir inchangé reste utilisable. Le catalogue indépendant apporte la confiance ; le candidat ne s’approuve pas lui-même.



