Всем известно, что pickle не является безопасным способом хранения пользовательских данных. Он даже говорит об этом на коробке.
Я ищу примеры строк или структур данных, которые нарушают разбор парсера в текущих поддерживаемых версиях cPython >= 2.4
. Есть ли вещи, которые можно мариновать, но не рассыпаться? Существуют ли проблемы с конкретными символами Unicode? Действительно большие структуры данных? Очевидно, что старый ASCII-протокол имеет некоторые проблемы, но как насчет самой текущей бинарной формы?
Мне особенно любопытно, как может работать операция pickle loads
, особенно когда задана строка, созданная самим рассолом. Существуют ли какие-либо обстоятельства, при которых маринование продолжит синтаксический анализ за .
?
Какие существуют краевые случаи?
Изменить: Вот несколько примеров того, что я ищу:
- В Python 2.4 вы можете выбрать массив без ошибок, но вы не можете его разблокировать. http://bugs.python.org/issue1281383
- Вы не можете надежно рассортировать объекты, которые наследуются от 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
фактически не останавливает синтаксический анализ - когда маркер существует как часть литерала или, в более общем плане, когда ему не предшествует новая строка.