Câu 1Mối nguy của việc gọi pickle.loads trên dữ liệu pickle không tin cậy là gì?
pickle và base64 — Serialization object và chuyển đổi binary sang text
Dùng pickle.dumps / loads để biến dict và class tự định nghĩa thành bytes rồi khôi phục đầy đủ, và base64.b64encode / b64decode để gửi binary qua đường text. Vừa chạy vừa xem kiểu trả về.
Ta sẽ tìm hiểu hai module dùng khi di chuyển dữ liệu qua file hoặc qua mạng. pickle lưu object Python (dict, instance của class, v.v.) dưới dạng có thể khôi phục đầy đủ sau này, còn base64 chuyển dữ liệu binary như ảnh hoặc âm thanh thành chuỗi "chữ số cộng hai ký hiệu" để bạn có thể nhét thẳng vào email, JSON, hay URL. Cả hai đều là module thư viện chuẩn cho chuyển đổi dữ liệu ở các ranh giới nội bộ hoặc kênh truyền bên ngoài.
Phân biệt mỗi module dùng cho việc gì
Hai module phân chia tự nhiên theo tổ hợp đầu vào/đầu ra. Hãy dùng sơ đồ dưới để nắm bức tranh tổng thể, rồi ta sẽ đào sâu vào các công dụng và API điển hình ở mỗi phần.
pickle — Chuyển object Python thẳng sang bytes
pickle là module thư viện chuẩn chuyển đổi object Python thành dạng có thể khôi phục đầy đủ sau này. Kết quả là giá trị bytes (chuỗi liên tục các số nguyên từ 0 đến 255 — kiểu dùng để xử lý "chuỗi số" thay vì "chuỗi ký tự" như chuỗi). Bytes là định dạng cơ bản cho tình huống máy, không phải người, sẽ đọc dữ liệu — lưu vào file, gửi qua mạng, chuyển dữ liệu cho tiến trình khác.
Khác với json, điểm mạnh của pickle là có thể lưu không chỉ dict / list / chuỗi / số mà còn cả instance của class tự định nghĩa và object hàm, nên hữu ích cho việc lưu model ML hoặc chuyển object giữa các tiến trình Python.
Đừng bao giờ loads dữ liệu pickle từ người khác
pickle.loads có thể thực thi mã Python tùy ý, nên truyền vào bytes từ nguồn không tin cậy trở thành lỗ hổng thực thi mã tùy ý. Hãy giới hạn ở tình huống "tôi tạo, tôi đọc lại" và không bao giờ dùng nó với dữ liệu nhận qua mạng hoặc từ người khác. Để giao tiếp bên ngoài, dùng json thay thế.
| Hàm | Vai trò | Ghi chú |
|---|---|---|
| pickle.dumps(obj) | object Python → bytes | trả về bytes (không phải str) |
| pickle.loads(b) | bytes → object Python | chỉ với nguồn tin cậy |
| pickle.dump(obj, file) | ghi vào file | mở ở chế độ binary open(..., "wb") |
| pickle.load(file) | đọc từ file | mở ở chế độ binary open(..., "rb") |
base64 — Đưa dữ liệu binary qua text
base64 là module chuyển dữ liệu binary tùy ý thành chuỗi "chữ số cộng hai ký hiệu". Vì 3 bytes thành 4 ký tự, kích thước tăng khoảng 1.33×, nhưng được dùng rộng rãi trong tình huống cần đưa dữ liệu binary qua kênh chỉ chấp nhận text, như đính kèm email, nhúng ảnh trong JSON hoặc URL, hoặc lưu bytes trong SQL.
Hai API cơ bản:
| Hàm | Đầu vào | Trả về |
|---|---|---|
| base64.b64encode(bytes) | bytes (dữ liệu nguồn) | bytes đã encode Base64 |
| base64.b64decode(Base64) | bytes / str (dạng Base64) | bytes gốc |
= đệm phần thiếu.import base64
# bytes → Base64
binary = b"Python is fun!"
encoded = base64.b64encode(binary)
print(encoded) # b'UHl0aG9uIGlzIGZ1biE='
print(encoded.decode()) # UHl0aG9uIGlzIGZ1biE= (chuyển sang str)
# Base64 → bytes
decoded = base64.b64decode(encoded)
print(decoded) # b'Python is fun!'
print(decoded == binary) # True
Cho URL, hãy dùng urlsafe_b64
b64encode chuẩn chứa + và /, nên nhúng trực tiếp vào URL hoặc key JSON cần escape. Cho URL và JSON, hãy chọn base64.urlsafe_b64encode — nó đổi + → - và / → _ để cho biến thể an toàn cho URL. Dùng base64.urlsafe_b64decode để khôi phục.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Kiểu của giá trị trả về từ pickle.dumps(obj) là gì?
Câu 3Hàm nào tốt nhất khi bạn muốn đặt một chuỗi base64 vào tham số query URL?