Python Pickle, избегая зависимостей модулей

Есть ли какой-то особый способ травления объектов, чтобы pickle.load() не зависел ни от каких модулей? Я читал, что при распаковке объектов Pickle пытается загрузить модуль, содержащий определение класса объекта. Есть ли способ избежать этого, чтобы pickle.load() не пытался загрузить какие-либо модули?


person appusajeev    schedule 30.07.2012    source источник


Ответы (2)


Может быть немного не связано, но все же я бы процитировал документацию:

Предупреждение. Модуль pickle не предназначен для защиты от ошибочных или злонамеренных данных. Никогда не расшифровывайте данные, полученные из ненадежного или неаутентифицированного источника.

Вам нужно написать собственный распаковщик, который избегает загрузки дополнительных модулей. Общий подход будет таким:

  • Получите свой собственный unpickler, создав подкласс pickle.Unpickler
  • Переопределить find_class(..)
  • Внутри find_class(..) Проверьте наличие модуля и класса, который необходимо загрузить. Избегайте загрузки, вызывая ошибки.
  • Используйте этот пользовательский класс для извлечения из строки.

Вот отличная статья о опасности использования рассола. Вы также найдете код, который имеет описанный выше подход.

person UltraInstinct    schedule 30.07.2012

Не имеет особого смысла то, что вы спрашиваете, поскольку сериализация и десериализация объектов является основной целью функциональности рассола. Если вы хотите что-то другое: сериализуйте или десериализуйте свои объекты в XML или JSON (или любой другой подходящий формат).

Есть, например. lxml.objectify или вы google для "Python сериализовать json" или "Python сериализовать xml"... но вы не можете десериализовать объект из рассола без определения его класса - по крайней мере, без дальнейшего кодирования.

http://docs.python.org/library/pickle.html

документирует, как написать собственный unpickler... возможно, это хороший способ начать, но это выглядит как неправильный способ сделать это.

person Andreas Jung    schedule 30.07.2012