¿Cómo guardar datos con Python?

Estoy trabajando en un progtwig en Python y quiero que los usuarios puedan guardar los datos en los que están trabajando. He mirado en cickle; Parece que sería una forma rápida y fácil de guardar datos, parece inseguro. Dado que funciones completas, clases, etc. pueden ser decapadas, me preocupa que un archivo guardado no autorizado pueda inyectar código dañino en el progtwig. ¿Hay alguna manera de evitarlo, o debería buscar otros métodos para guardar datos, como convertir directamente a una cadena (que también parece insegura) o crear una jerarquía XML y colocar datos en eso?

Soy nuevo en Python, así que por favor tengan paciencia conmigo.

¡Gracias por adelantado!

EDITAR: En cuanto al tipo de datos que estoy almacenando, se trata principalmente de diccionarios y listas. Información como nombres, velocidades, etc. Es bastante simple ahora, pero puede volverse más complejo en el futuro.

Desde su descripción, la encoding JSON es la solución segura y rápida. Hay un módulo json en python2.6, puedes usarlo así:

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

El formato JSON es legible para los humanos y es muy similar a la representación de la cadena del diccionario en python. Y no tiene ningún problema de seguridad como el pepinillo. Si no tienes python2.6 puedes instalar cjson o simplejson

No puedes usar JSON para guardar objetos de Python como Pickle. Pero puede usarlo para guardar: cadenas, diccionarios, listas, … Puede ser suficiente para la mayoría de los casos.

Para explicar por qué pickle es inseguro. De los documentos de Python:

La mayoría de los problemas de seguridad que rodean al módulo pickle y cPickle involucran la eliminación de los problemas. No se conocen vulnerabilidades de seguridad relacionadas con el decapado porque usted (el progtwigdor) controla los objetos con los que interactúa Pickle, y todo lo que produce es una cadena.

Sin embargo, para descifrar, nunca es una buena idea desentrañar una cadena no confiable cuyos orígenes son dudosos, por ejemplo, las cadenas leídas desde un socket. Esto se debe a que la descifrado puede crear objetos inesperados e incluso potencialmente ejecutar métodos de esos objetos, como el constructor de su clase o el destructor … La moraleja de la historia es que debe tener mucho cuidado con el origen de las cadenas que su aplicación elimina.

Hay algunas formas de defenderse, pero es mucho más fácil usar JSON en su caso.

Podrías hacer algo como:

escribir

  • Conservar en vinagre
  • Firmar archivo en escabeche
  • Hecho

leer

  • Comprobar firma del archivo encurtido
  • Deshacer
  • Utilizar

Aunque me pregunto qué te hace pensar que los archivos de datos se manipularán pero tu aplicación no lo será.

Debe darnos más contexto antes de que podamos responder: ¿qué tipo de datos está guardando, cuánto hay, cómo desea acceder a ella?

En cuanto a los encurtidos: no almacenan código. Cuando escoge una función o clase, es el nombre que se almacena, no el código en sí.

***** En esta respuesta, solo me preocupa la corrupción accidental de la integridad de la aplicación. *****

Pickle es “seguro”. Lo que podría ser inseguro es acceder al código que no escribió, por ejemplo, en complementos; Eso no es relevante para los encurtidos.

Cuando selecciona un objeto, todos sus datos se guardan, pero el código y la implementación no. Esto significa que cuando se desmarca, un objeto actualizado puede encontrar que tiene datos “antiguos” (si actualiza la implementación). Esto es algo que debe saber y manejar, si corresponde.

Decapado cadenas, listas, números, dados es muy fácil y funciona perfectamente, y es similar a JSON. La magia de Pickle es que, a veces sin ajustes, incluso los objetos de python complejos pueden ser decapados. Pero solo los datos son decapados; las instancias se reconstruyen simplemente por el nombre del módulo guardado y el nombre del tipo del objeto.

Debe utilizar una base de datos de algún tipo. Almacenar en formato pickle no es una buena idea (en la mayoría de los casos). Usted puede considerar:

  • SQLite : (incluido en Python 2.5+) rápido y simple, pero requiere conocimientos de SQL y DB-API
  • buzhug : base de datos no SQL basada en archivos con syntax pythonic
  • Base de datos SQL: puede usar la interfaz para algunos de los DBMS (como MySQL, PostreSQL, etc.), pero solo es bueno para una gran cantidad de datos (miles de registros).

Puede encontrar algunas otras soluciones aquí .

¿Quién, específicamente, es el sociópata que está atravesando el esfuerzo por romper un progtwig hackeando el archivo en escabeche?

Es Python. El sociópata tiene tu fuente. No tienen que perder el tiempo para piratear tu archivo de salmuera. Solo pueden editar su fuente y hacer todo el “daño” que quieran.

No se preocupe por la “inseguridad” a menos que esté involucrado en un litigio con sindicatos del crimen organizado.

No se preocupe por “un archivo guardado no autorizado podría inyectar código dañino en el progtwig”. Nadie se molestará con un archivo guardado no autorizado cuando tengan la fuente.

Puede disfrutar trabajando con el módulo y_serial en http://yserial.sourceforge.net

que se lee como un tutorial pero operacionalmente ofrece un código de trabajo para la serialización y la persistencia. El comentario analiza algunos de los pros y los contras relacionados con las cuestiones planteadas aquí.

Está diseñado para ser una solución general para almacenar objetos Python comprimidos con SQLite (sin casi ningún problema de SQL 😉

Espero que esto ayude.