Ngâm trong trăn


Gần đây khi chạy thử một vài thuật toán Deep Learning, đặc biệt là thuật toán cung cấp mã nguồn sử dụng thư viện Caffe, gặp một số vấn đề liên quan đến mô-đun Pickle trong Python.
Thực ra, bình thường cũng không định viết gì cả. Nhưng nhớ ra mình cũng quan tâm đến chủ đề Serialization/Deserialization này. Nó có vai trò giống như ASN. 1 mà có thể tìm thấy hồi phục trước, hay biến phổ biến nhất của thể loại này là Bộ đệm giao thức của Google, hay Apache Thrift. Thế là note lại cái để quên nó đi.

1. Pickle – Chuyển đổi một đối tượng Python sang định dạng nhị phân và đảo ngược

  • Sử dụng cách thức chuyển đổi riêng [chỉ dành riêng cho Python], không gắn với bất kỳ chuyển đổi chuẩn nào
  • Không có cơ chế phân tách định nghĩa dữ liệu với việc mã hóa dữ liệu đó.
    Dữ liệu được viết ra phải là đối tượng Python, và chỉ có thể đọc được trong Python.
  • Có thể ghi ra/tải vào hầu hết các đối tượng của các biến kiểu dữ liệu phổ biến
  • File pickle được ghi ra hoàn toàn có thể đọc được trong môi trường Python khác. [Tất nhiên là có tương thích về phiên bản giao thức]

2. Pickle – không an toàn

Mặc định, nó sẽ nhập tất cả các mô-đun có trong dữ liệu từ tệp được tải lên.
Thế này thì vãi quá.
by so, nguoi ta su dung khong nên cứ thế tải vào một file pickle không rõ nguồn gốc. vì éo ai biết nó tải cái gì và sẽ chạy cái gì sau đó.

chia sẻ

  • Facebook
  • Twitter
  • reddit
  • Ứng dụng trò chuyện
  • Tumblr
  • E-mail
  • LinkedIn

Thích bài này

Thích Đang tải.

Có liên quan

Pickle, là một phần của thư viện Python theo mặc định, là một mô-đun quan trọng bất kể khi nào bạn cần sự kiên cố giữa các phiên bản người dùng. Là một mô-đun, pickle cung cấp cho việc lưu các đối tượng Python giữa các tiến trình

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

Lưu ý. Khái niệm về tẩy cũng được gọi là tuần tự hóa, sắp xếp lại 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 một tệp để truy xuất sau này. Pickling hoàn thành điều này bằng cách viết các đối tượng dưới dạng một chuỗi byte dài

Mã ví dụ Pickle bằng Python

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

đối tượng pickle nhập khẩu = Object[] filehandler = open [tên tệp, 'w'] pickle. dump [đối tượng, filehandler]

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

nhập khẩu pickle Nhập khẩu toán học object_pi = toán học. pi file_pi = open['tên_pi. obj', 'w'] dưa chua. kết xuất [đối tượng_pi, tệp_pi]

Đoạn mã này ghi nội dung của object_pi vào tệp tin handler file_pi , do đó nó được gắn 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 chưa được nhập để sử dụng, hãy bắt đầu bằng cách nhập nó

importle filehandler = open [file name, 'r'] object = pickle. tải [trình xử lý tệp]

Mã sau khôi phục giá trị của pi

nhập tệp_pi2 = mở ['tên tệp_pi. obj', 'r'] object_pi2 = dưa chua. tải [tệp_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ể tái sử dụng tên ban đầu, nếu bạn thích

Ví dụ này sử dụng tên riêng biệt để xác định rõ ràng

Những điều cần nhớ về Pickle

Vui lòng ghi nhớ những điều này khi sử dụng mô-đun dưa chuột

  • Giao thức dưa chua dành riêng cho Python - nó không được đảm bảo tương thích với ngôn ngữ chéo. Bạn hầu như không thể chuyển thông tin để làm cho thông tin hữu ích trong Perl, PHP, Java hoặc các ngôn ngữ khác
  • Cũng không có sự đảm bảo về tính tương thích giữa các phiên bản Python khác nhau. Tôi không thích tồn tạ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
  • Theo mặc định, phiên bản mới nhất của giao thức dưa được sử dụng. Nó vẫn như vậy trừ khi bạn tự thay đổi nó

mẹo. Cũng tìm hiểu cách sử dụng giá đỡ để lưu các đối tượng trong Python cho một phương pháp duy trì tính liên tục của các đối tượng khác

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. Mạng 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

Chủ Đề