Question 1Quel est le danger d'appeler pickle.loads sur des données pickle non fiables ?
pickle et base64 — Sérialisation d'objets et conversion binaire-vers-texte
pickle.dumps / loads transforment un dict ou une classe maison en bytes puis restaurent à l'identique, et base64.b64encode / b64decode font passer des données binaires par un canal texte.
Nous couvrirons deux modules utilisés lorsqu'on déplace des données à travers des fichiers ou sur le réseau. pickle sauve des objets Python (dicts, instances de classe, etc.) sous une forme qui peut être entièrement restaurée plus tard, tandis que base64 convertit des données binaires comme images ou audio en une chaîne d'"alphanumériques plus deux symboles" pour pouvoir l'insérer directement dans un e-mail, du JSON ou des URLs. Les deux sont des modules de la bibliothèque standard pour la conversion de données aux frontières internes ou aux transports externes.
Démêler à quoi sert chaque module
Les deux modules se séparent naturellement par combinaison entrée/sortie. Utilise le diagramme ci-dessous pour saisir la vue d'ensemble, puis nous creuserons les usages typiques et les API dans chaque section.
pickle — Convertir des objets Python directement en bytes
pickle est un module de la bibliothèque standard qui convertit des objets Python en une forme qui peut être entièrement restaurée plus tard. Le résultat est une valeur bytes (une séquence contiguë d'entiers de 0 à 255 — un type pour gérer des "séquences de nombres" plutôt que des "séquences de caractères" comme les chaînes). Les bytes sont le format de base pour les situations où ce sont des machines, pas des humains, qui liront les données — sauvegarde dans des fichiers, envoi sur le réseau, transmission de données à un autre processus.
Contrairement à json, la force de pickle est de pouvoir sauver non seulement dicts / lists / chaînes / nombres mais aussi des instances de classes personnalisées et des objets fonction, ce qui le rend utile pour sauver des modèles ML ou passer des objets entre processus Python.
Ne fais jamais loads sur des données pickle venant d'ailleurs
pickle.loads peut exécuter du code Python arbitraire, donc lui passer des bytes provenant d'une source non fiable devient une vulnérabilité d'exécution de code arbitraire. Limite-toi aux scénarios "je l'ai créé, je le relis" et n'utilise jamais pickle sur des données reçues du réseau ou de quelqu'un d'autre. Pour la communication externe, utilise json à la place.
| Fonction | Rôle | Notes |
|---|---|---|
| pickle.dumps(obj) | objet Python → bytes | retourne des bytes (pas str) |
| pickle.loads(b) | bytes → objet Python | sources de confiance uniquement |
| pickle.dump(obj, file) | écrire dans un fichier | ouvrir en mode binaire open(..., "wb") |
| pickle.load(file) | lire depuis un fichier | ouvrir en mode binaire open(..., "rb") |
base64 — Faire transiter des données binaires à travers du texte
base64 est un module qui convertit des données binaires arbitraires en une chaîne d'"alphanumériques plus deux symboles". Comme 3 octets deviennent 4 caractères, la taille augmente d'environ 1.33×, mais il est largement utilisé dans les situations où tu dois faire passer des données binaires à travers des canaux texte uniquement, comme les pièces jointes d'e-mail, l'intégration d'images dans du JSON ou des URLs, ou le stockage de bytes dans SQL.
Les deux API de base :
| Fonction | Entrée | Retourne |
|---|---|---|
| base64.b64encode(bytes) | bytes (les données source) | bytes encodés en Base64 |
| base64.b64decode(Base64) | bytes / str (forme Base64) | les bytes d'origine |
= comme padding pour combler.import base64
# bytes → Base64
binary = b"Python is fun!"
encoded = base64.b64encode(binary)
print(encoded) # b'UHl0aG9uIGlzIGZ1biE='
print(encoded.decode()) # UHl0aG9uIGlzIGZ1biE= (converti en str)
# Base64 → bytes
decoded = base64.b64decode(encoded)
print(decoded) # b'Python is fun!'
print(decoded == binary) # True
Pour les URLs, utilise urlsafe_b64
Le b64encode standard inclut + et /, donc l'intégrer directement dans des URLs ou des clés JSON nécessite un échappement. Pour les URLs et JSON, choisis base64.urlsafe_b64encode à la place — il échange + → - et / → _ pour te donner une variante URL-safe. Utilise base64.urlsafe_b64decode pour restaurer.
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Quel est le type de la valeur de retour de pickle.dumps(obj) ?
Question 3Quelle fonction est la meilleure quand tu veux mettre une chaîne base64 dans un paramètre de requête URL ?