ProgramlamaBackend geliştirici

Python'daki yerleşik veri seri hale getirme mekanizmasının nasıl çalıştığını açıklayın (pickle ve json modülleri). Aralarındaki farklar nelerdir, hangi amaçlarla kullanılırlar, dikkatsiz bir seri hale getirmenin hangi tehlikeleri vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Python'da serileştirme (objeleri depolama/gönderim için bayt dizisine veya dizeye dönüştürme) için pickle ve json modülleri kullanılır:

  • pickle, Python'daki herhangi bir nesneyi (hatta sınıflar ve fonksiyonlar!) serileştirir, ancak sonuç — ikili bir dizidir. Yalnızca Python ekosistemi içinde çalışır.
  • json, yalnızca basit veri yapılarını (dict, list, str, int, float) serileştirir; bu nedenle sonuç bir dize (evrensel format) olur ve diğer dillerle uyumludur.

Pickle'ı kontrol edilemeyen taraflar arasında veri depolama/gönderme için kullanmak tehlikelidir, çünkü serileştirme sırasındaki zararlı bir kodu çalıştırılabilir. json bu dezavantajı taşımaz.

Çalışma örneği:

import pickle import json # Pickle (ikili serileştirme) data = {'x': 10, 'func': lambda x: x + 1} with open('data.pkl', 'wb') as f: pickle.dump(data, f) # JSON (sadece basit nesneler) data = {'x': 10, 'y': [1, 2, 3]} with open('data.json', 'w') as f: json.dump(data, f)

Kandırmaca Sorusu

Soru: Herhangi bir Python nesnesini seri hale getirip oturumlar arasında saklamak için pickle kullanmak mümkün mü? Bu mekanizmanın kullanıcı verilerini saklamak için neden önerilmediği?

Cevap:

Hayır, pickle'ı her yerde kullanmak kötü bir uygulamadır. Güvenlikten ("yabancı" bir pickled nesne yüklerken yapılacak işlemler tehlikeye girebilir) başka, Python veya sınıf versiyonları arasındaki uyumsuzluk problemi vardır — serileştirilen nesneler yüklenemeyebilir veya sınıf yapıları değişirse yanlış davranabilir.

Örnek:

# Pickle dosyasını yükleme, sınıf yapısı değişti import pickle with open('old_version.pkl', 'rb') as f: obj = pickle.load(f) # AttributeError veya yapı uyuşmazlığı

Tarihçe

Örnek 1

Büyük bir projede kullanıcı profillerinin depolanması için pickle kullanıldı. Python sürümünün güncellenmesi ve sınıfların değiştirilmesiyle, serileştirilen nesnelerin yapısı uyumluluğunu yitirdi ve sistemin çökmesine, çoğu kullanıcının verisinin kaybolmasına neden oldu.


Örnek 2

Bir web servisinde kullanıcı oturumları için pickle kullanıldı. Kötü niyetli bir kişi, sunucuda kod enjeksiyonuna izin veren zararlı bir pickled nesnesi yükledi.


Örnek 3

Birçok ortamda ağı üzerinden iletilmek üzere işlevleri pickle aracılığıyla serileştirme girişimi başarısız oldu: pickled lambda, farklı yapılandırmalardaki/farklı Python sürümlerindeki makineler arasında taşıyamaz.