Dùng trăn muối

Trong Python, bạn có thể sử dụng pickle để tuần tự hóa [giải tuần tự hóa] một cấu trúc đối tượng thành [từ] một luồng byte. Dưới đây là các phương pháp hay nhất để tẩy Python an toàn

Bởi Ashutosh Agrawal, cố vấn cao cấp, và Arvind Balaji, cố vấn liên kết, Synopsys

Pickle trong Python chủ yếu được sử dụng trong tuần tự hóa và giải tuần tự hóa cấu trúc đối tượng Python. Nói cách khác, đó là quá trình chuyển đổi một đối tượng Python thành luồng byte để lưu trữ nó trong tệp/cơ sở dữ liệu, duy trì trạng thái chương trình qua các phiên hoặc truyền dữ liệu qua mạng. Luồng byte được chọn có thể được sử dụng để tạo lại hệ thống phân cấp đối tượng ban đầu bằng cách bỏ chọn luồng. Toàn bộ quá trình này tương tự như tuần tự hóa đối tượng trong Java hoặc. Bọc lưới

Khi một luồng byte không được chọn, trước tiên mô-đun pickle sẽ tạo một phiên bản của đối tượng ban đầu và sau đó điền vào phiên bản đó bằng dữ liệu chính xác. Để đạt được điều này, luồng byte chỉ chứa dữ liệu dành riêng cho thể hiện đối tượng ban đầu. Nhưng chỉ có dữ liệu thôi có thể không đủ. Để giải nén thành công đối tượng, luồng byte đã chọn chứa các hướng dẫn cho trình giải mã để tái tạo lại cấu trúc đối tượng ban đầu cùng với toán hạng lệnh, giúp điền vào cấu trúc đối tượng

Theo tài liệu mô-đun dưa chua, các loại sau có thể được ngâm

  • Không, đúng và sai
  • Số nguyên, số nguyên dài, số dấu phẩy động, số phức
  • Chuỗi bình thường và Unicode
  • Bộ dữ liệu, danh sách, bộ và từ điển chỉ chứa các đối tượng có thể chọn
  • Các chức năng được xác định ở cấp cao nhất của mô-đun
  • Các chức năng tích hợp được xác định ở cấp cao nhất của mô-đun
  • Các lớp được định nghĩa ở cấp cao nhất của mô-đun

Pickle cho phép các đối tượng khác nhau khai báo cách chúng nên được ngâm bằng phương thức __reduce__. Bất cứ khi nào một đối tượng được chọn, phương thức __reduce__ được xác định bởi nó sẽ được gọi. Phương thức này trả về một chuỗi, có thể đại diện cho tên của toàn cục Python hoặc một bộ mô tả cách tái tạo lại đối tượng này khi giải nén

Nói chung, tuple bao gồm hai đối số

  • Có thể gọi được [trong hầu hết các trường hợp sẽ là tên của lớp cần gọi]
  • Các đối số được chuyển đến có thể gọi ở trên

Thư viện pickle sẽ chọn riêng từng thành phần của bộ dữ liệu và sẽ gọi đối tượng có thể gọi được trên các đối số được cung cấp để xây dựng đối tượng mới trong quá trình giải nén

Nguy hiểm khi ngâm trăn

Vì không có cách hiệu quả nào để xác minh luồng pickle đang được giải nén, nên có thể cung cấp mã shell độc hại làm đầu vào, gây ra việc thực thi mã từ xa. Kịch bản tấn công phổ biến nhất dẫn đến điều này là tin tưởng vào dữ liệu pickle thô nhận được qua mạng. Nếu kết nối không được mã hóa, dưa nhận được cũng có thể đã được sửa đổi trên dây. Một kịch bản tấn công khác là khi kẻ tấn công có thể truy cập và sửa đổi các tệp pickle được lưu trữ từ bộ đệm, hệ thống tệp hoặc cơ sở dữ liệu

Mã ví dụ sau thể hiện chữ ký và xác minh mật mã. Chữ ký mật mã, như đã đề cập ở trên, giúp phát hiện bất kỳ sự thay đổi nào của dữ liệu đã chọn. Khách hàng sử dụng HMAC để ký dữ liệu. Nó gửi giá trị thông báo cùng với dữ liệu được chọn đến máy chủ như hình bên dưới

Pickle, is an part of the Python library theo default, is an module quan trọng bất cứ khi nào bạn cần sự chắc chắn giữa các phiên bản người dùng. Là một mô-đun, pickle cung cấp khả năng lưu các đối tượng Python giữa các quy trình

Cho dù bạn đang lập trình cho cơ sở dữ liệu , trò chơi, diễn đàn hoặc một số ứng dụng khác phải lưu thông tin . Mô-đun dưa chua có thể lưu trữ những thứ như kiểu dữ liệu như boolean, chuỗi và mảng byte, danh sách, từ điển, hàm, v. v.

Lưu ý.  Khái niệm tẩy còn được gọi là nối tiếp, sắp xếp và làm phẳng. Tuy nhiên, các điểm luôn giống nhau — lưu một đối tượng vào tệp để truy xuất sau này. Pickling hoàn thành điều chỉnh này bằng cách ghi đối tượng bên dưới dưới dạng một byte dòng dài.

Ví dụ về dưa chua bằng Python

Để ghi một đối tượng vào tệp, bạn sử dụng mã theo cú pháp sau

import pickle 
object = Object []
filehandler = open [filename, 'w']
pickle.dump [object, filehandler]

Đây là cách một ví dụ trong thế giới thực sự trông như thế nào

import pickle 
import math
object_pi = math.pi
file_pi = open ['filename_pi.obj', 'w']
pickle.dump [object_pi, file_pi]

Đoạn mã này ghi nội dung của object_pi vào file_pi của trình xử lý tệp , đến lượt nó được liên kết với tệp filename_pi.obj trong thư mục thực thi.

Để khôi phục giá trị của đối tượng vào bộ nhớ, hãy tải đối tượng xuống từ tệp. Giả sử rằng dưa chua chưa được nhập để sử dụng, hãy bắt đầu bằng cách nhập nó.

import pickle 
filehandler = open [filename, 'r']
object = pickle.load [filehandler]

Đoạn mã sau Khôi phục giá trị của số pi

import pickle 
file_pi2 = open ['filename_pi.obj', 'r']
object_pi2 = pickle.load [file_pi2]

Đối tượng sau đó đã sẵn sàng để sử dụng một lần nữa, lần này là object_pi2. Tất nhiên, bạn có thể sử dụng lại tên ban đầu, nếu bạn thích. Ví dụ này sử dụng các tên riêng biệt để rõ ràng.

Những điều cần nhớ về dưa chua

Hãy ghi nhớ những điều này khi sử dụng mô-đun dưa chua

  • Giao thức pickle dành riêng cho Python - nó không được đảm bảo là tương thích với nhiều ngôn ngữ. Rất có thể bạn không thể chuyển thông tin để làm cho nó hữu ích bằng Perl, PHP, Java hoặc các ngôn ngữ khác.
  • Vẫn không có gì chắc chắn về khả năng tương thích giữa các phiên bản Python khác nhau. Sự kiện không tương thích tồn tại bởi vì không phải mọi cấu trúc dữ liệu Python đều có thể được tuần tự hóa bởi mô-đun.

Chủ Đề