Pregunta 1¿Cuál es el peligro de llamar a pickle.loads con datos pickle no confiables?
pickle y base64 — Serialización de objetos y conversión binario-texto
Serializa dict y clases propias a bytes con pickle.dumps / loads y restáuralas íntegras, y transporta binario por canales de texto con base64.b64encode / b64decode observando los tipos.
Cubriremos dos módulos usados al mover datos a través de archivos o por la red. pickle guarda objetos Python (dicts, instancias de clases, etc.) en una forma que se puede restaurar completamente más tarde, mientras que base64 convierte datos binarios como imágenes o audio en una cadena de "alfanuméricos más dos símbolos" para que puedas insertarlos directamente en email, JSON o URLs. Ambos son módulos de la biblioteca estándar para conversión de datos en límites internos o transportes externos.
Aclarando para qué sirve cada módulo
Los dos módulos se separan naturalmente por combinación de entrada/salida. Usa el diagrama de abajo para captar la idea general; luego profundizaremos en usos típicos y APIs en cada sección.
pickle — Convertir objetos Python directamente a bytes
pickle es un módulo de la biblioteca estándar que convierte objetos Python en una forma que se puede restaurar completamente más tarde. El resultado es un valor bytes (una secuencia contigua de enteros de 0 a 255 — un tipo para manejar "secuencias de números" en lugar de "secuencias de caracteres" como las cadenas). Bytes es el formato básico para situaciones donde las máquinas, no los humanos, leerán los datos — guardar a archivos, enviar por la red, entregar datos a otro proceso.
A diferencia de json, la fortaleza de pickle es poder guardar no solo dicts / lists / cadenas / números, sino también instancias de clases personalizadas y objetos función, lo que lo hace útil para guardar modelos ML o pasar objetos entre procesos Python.
Nunca hagas loads de pickle de otra persona
pickle.loads puede ejecutar código Python arbitrario, así que pasarle bytes de una fuente no confiable se convierte en una vulnerabilidad de ejecución de código arbitrario. Limítate a escenarios de "yo lo creé, yo lo leo de vuelta" y nunca lo uses en datos recibidos por la red o de otra persona. Para comunicación externa, usa json en su lugar.
| Función | Función | Notas |
|---|---|---|
| pickle.dumps(obj) | objeto Python → bytes | devuelve bytes (no str) |
| pickle.loads(b) | bytes → objeto Python | solo fuentes confiables |
| pickle.dump(obj, file) | escribir a un archivo | abrir en modo binario open(..., "wb") |
| pickle.load(file) | leer desde un archivo | abrir en modo binario open(..., "rb") |
base64 — Mover datos binarios a través de texto
base64 es un módulo que convierte datos binarios arbitrarios en una cadena de "alfanuméricos más dos símbolos". Como 3 bytes se convierten en 4 caracteres, el tamaño crece aproximadamente 1.33×, pero se usa ampliamente en situaciones donde necesitas transportar datos binarios por canales solo de texto, como adjuntos de email, incrustar imágenes en JSON o URLs, o almacenar bytes en SQL.
Las dos APIs básicas:
| Función | Entrada | Devuelve |
|---|---|---|
| base64.b64encode(bytes) | bytes (los datos fuente) | bytes codificados en Base64 |
| base64.b64decode(Base64) | bytes / str (forma Base64) | los bytes originales |
= para cualquier déficit.import base64
# bytes → Base64
binary = b"Python is fun!"
encoded = base64.b64encode(binary)
print(encoded) # b'UHl0aG9uIGlzIGZ1biE='
print(encoded.decode()) # UHl0aG9uIGlzIGZ1biE= (convertido a str)
# Base64 → bytes
decoded = base64.b64decode(encoded)
print(decoded) # b'Python is fun!'
print(decoded == binary) # True
Para URLs, usa urlsafe_b64
El b64encode estándar incluye + y /, así que incrustarlo directamente en URLs o claves JSON requiere escaparlo. Para URLs y JSON, elige base64.urlsafe_b64encode en su lugar — cambia + → - y / → _ para darte una variante URL-safe. Usa base64.urlsafe_b64decode para restaurar.
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Cuál es el tipo del valor de retorno de pickle.dumps(obj)?
Pregunta 3¿Qué función es la mejor cuando quieres poner una cadena base64 en un parámetro de URL?