Как сохранить данные с помощью Python?

Я работаю над программой на Python и хочу, чтобы пользователи могли сохранять данные, над которыми они работают. Я просмотрел cPickle; похоже, что это будет быстрый и простой способ сохранить данные, кажется, небезопасным. Поскольку целые функции, классы и т.д. Можно мариновать, я обеспокоен тем, что файл сохранения изгоев может вводить вредоносный код в программу. Есть ли способ предотвратить это, или я должен искать другие методы сохранения данных, такие как прямое преобразование в строку (что также кажется неуверенным) или создание иерархии XML и размещение данных в этом.

Я новичок в python, поэтому, пожалуйста, несите меня.

Спасибо заранее!

EDIT: Что касается типа данных, которые я храню, это в основном словари и списки. Информация, такая как имена, скорости и т.д. Это довольно просто сейчас, но может стать более сложным в будущем.

Ответ 1

Из вашего описания Кодирование JSON является безопасным и быстрым решением. В python2.6 есть json-модуль, вы можете использовать его следующим образом:

import json
obj = {'key1': 'value1', 'key2': [1, 2, 3, 4], 'key3': 1322}
encoded = json.dumps(obj)
obj = json.loads(encoded)

Формат JSON является читабельным человеком и очень похож на представление строки словаря в python. И не имеет никаких проблем с безопасностью, таких как рассол. Если у вас нет python2.6, вы можете установить cjson или simplejson

Вы не можете использовать JSON для сохранения объектов python, таких как Pickle. Но вы можете использовать его для сохранения: строки, словари, списки,... Этого может быть достаточно для большинства случаев.

Чтобы объяснить, почему рассол небезопасен. Из python docs:

Большинство проблем безопасности окружающий рассол и cPickle модуль включает рассыпание. Есть неизвестных уязвимостей безопасности связанные с травлением, потому что вы ( программист) управляет объектами, которые рассол будет взаимодействовать, и все это производит строку.

Однако для рассыпания это никогдахорошая идея рассыпать ненадежную строка, происхождение которой сомнительно, для Например, строки, считанные из сокета. Это связано с тем, что неожиданных объектов и даже потенциально запускать методы этих объекты, такие как их класс конструктор или деструктор... Мораль истории состоит в том, что вы должны быть очень осторожны в отношении источник строк вашего приложения unpickles.

Есть несколько способов защитить себя, но гораздо проще использовать JSON в вашем случае.

Ответ 2

Вы можете сделать что-то вроде:

написать

  • Рассол
  • Подписать маринованный файл
  • Готово

читать

  • Проверить пикантную подпись файла
  • Unpickle
  • Использование

Интересно, но почему вы думаете, что файлы данных будут подделаны, но ваше приложение не будет?

Ответ 3

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

Что касается соленья: они не хранят код. Когда вы выбираете функцию или класс, это имя сохраняется, а не сам код.

Ответ 4

***** В этом ответе меня беспокоит только случайное повреждение целостности приложения. *****

Рассол "безопасен". Что может быть небезопасным - это доступ к коду, который вы не писали, например, в плагинах; это не относится к рассолам.

Когда вы распиливаете объект, все его данные сохраняются, но кода и реализации нет. Это означает, что при рассыплении обновленный объект может обнаружить, что внутри него есть "старые" данные (если вы обновляете реализацию). Это то, что вы должны знать и обрабатывать, если это применимо.

Травление строк, списков, цифр, диктов очень просто и отлично работает, и сравнимо с JSON. Магия Pickle заключается в том, что - иногда без настройки - даже сложные объекты python могут быть маринованными. Но только данные маринуются; экземпляры восстанавливаются просто по имени сохраненного модуля и типу имени объекта.

Ответ 5

Вы должны использовать какую-либо базу данных. Хранение в формате рассола не является хорошей идеей (в большинстве случаев). Вы можете подумать:

  • SQLite - (входит в Python 2.5+) быстро и просто, но требует знания SQL и DB-API
  • buzhug - не-SQL, файловая база данных с синтаксисом pythonic
  • База данных SQL - вы можете использовать интерфейс для некоторых СУБД (например, MySQL, PostreSQL и т.д.), но это полезно только для большого объема данных (тысячи записей).

Вы можете найти другие решения здесь.

Ответ 6

Кто - конкретно - это социопат, который пытается разбить программу, взломав маринованный файл?

Это Python. У вашего социопата есть ваш источник. Им не нужно обманывать, взломав файл рассола. Они могут просто отредактировать ваш источник и сделать все "повреждение", которое они хотят.

Не беспокойтесь о "неуверенности", если вы не участвуете в судебных разбирательствах с синдикатами организованной преступности.

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

Ответ 7

Вам может понравиться работать с модулем y_serial http://yserial.sourceforge.net

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

Он предназначен для общего решения хранение сжатых объектов Python с помощью SQLite (почти без суеты SQL; -)

Надеюсь, что это поможет.