Python pickle - как он ломается?

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

Я ищу примеры строк или структур данных, которые нарушают синтаксический анализ в текущих поддерживаемых версиях cPython> = 2.4 . Есть вещи, которые можно мариновать, но нельзя не мариновать? Есть ли проблемы с отдельными символами Юникода? Действительно большие структуры данных? Очевидно, что у старого протокола ASCII есть некоторые проблемы, но как насчет самой последней двоичной формы?

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

Какие существуют крайние случаи?

Редактировать: Вот несколько примеров того, что я ' m ищет:

  • В Python 2.4 вы можете обработать массив без ошибок, но вы не можете распаковать его. http://bugs.python.org/issue1281383
  • Вы можете ' t надежно обрабатывает объекты, которые наследуются от dict, и вызывают __ setitem __ до того, как переменные экземпляра будут установлены с помощью __ setstate __ . Это может быть проблемой при мариновании объектов Cookie. См. http://bugs.python.org/issue964868 и http://bugs.python.org/issue826897
  • Python 2.4 (и 2.5?) Вернет значение рассола для бесконечности. (или близкие к нему значения, например 1e100000), но может (в зависимости от платформы) завершиться ошибкой при загрузке. См. http://bugs.python.org/issue880990 и http://bugs.python.org/issue445484
  • Этот последний элемент интересен, поскольку он раскрывает случай, когда STOP маркер фактически не прекращает синтаксический анализ - когда маркер существует как часть литерала или, в более общем смысле, когда ему не предшествует новая строка.

12
задан Paul McMillan 9 November 2010 в 12:05
поделиться