Есть ли какой-то особый способ травления объектов, чтобы pickle.load() не зависел ни от каких модулей? Я читал, что при распаковке объектов Pickle пытается загрузить модуль, содержащий определение класса объекта. Есть ли способ избежать этого, чтобы pickle.load() не пытался загрузить какие-либо модули?
Python Pickle, избегая зависимостей модулей
Ответы (2)
Может быть немного не связано, но все же я бы процитировал документацию:
Предупреждение. Модуль pickle не предназначен для защиты от ошибочных или злонамеренных данных. Никогда не расшифровывайте данные, полученные из ненадежного или неаутентифицированного источника.
Вам нужно написать собственный распаковщик, который избегает загрузки дополнительных модулей. Общий подход будет таким:
- Получите свой собственный unpickler, создав подкласс
pickle.Unpickler
- Переопределить
find_class(..)
- Внутри
find_class(..)
Проверьте наличие модуля и класса, который необходимо загрузить. Избегайте загрузки, вызывая ошибки. - Используйте этот пользовательский класс для извлечения из строки.
Вот отличная статья о опасности использования рассола. Вы также найдете код, который имеет описанный выше подход.
Не имеет особого смысла то, что вы спрашиваете, поскольку сериализация и десериализация объектов является основной целью функциональности рассола. Если вы хотите что-то другое: сериализуйте или десериализуйте свои объекты в XML или JSON (или любой другой подходящий формат).
Есть, например. lxml.objectify или вы google для "Python сериализовать json" или "Python сериализовать xml"... но вы не можете десериализовать объект из рассола без определения его класса - по крайней мере, без дальнейшего кодирования.
http://docs.python.org/library/pickle.html
документирует, как написать собственный unpickler... возможно, это хороший способ начать, но это выглядит как неправильный способ сделать это.