15

私は Python でプログラムに取り組んでおり、ユーザーが作業中のデータを保存できるようにしたいと考えています。私は cPickle を調べました。データを保存するための高速で簡単な方法のようですが、安全ではないようです。関数、クラスなど全体がピクルされる可能性があるため、不正な保存ファイルがプログラムに有害なコードを挿入する可能性があるのではないかと心配しています。それを防ぐ方法はありますか、または文字列に直接変換する(これも安全ではないようです)、XML階層を作成してデータを入れるなど、データを保存する他の方法を検討する必要があります。

私はpythonが初めてなので、ご容赦ください。

前もって感謝します!

編集:私が保存しているデータの種類は、主に辞書とリストです。名前、速度などの情報。現在はかなり単純ですが、将来はさらに複雑になる可能性があります。

4

7 に答える 7

23

あなたの説明から、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 を使用して Pickle などの Python オブジェクトを保存することはできません。ただし、文字列、辞書、リストなどを保存するために使用できます...ほとんどの場合、これで十分です。

pickle が安全でない理由を説明する。python docsから:

pickle と cPickle モジュールを取り巻くセキュリティ問題のほとんどは unpickle に関係しています。pickle が対話するオブジェクトを制御するのはプログラマーであり、生成されるのは文字列だけであるため、pickle に関連する既知のセキュリティ上の脆弱性はありません。

ただし、unpickle の場合、ソースが疑わしい信頼できない文字列 (ソケットから読み取った文字列など) を unpickle することは決して良い考えではありません。これは、unpickle によって予期しないオブジェクトが作成され、クラス コンストラクターやデストラクタなど、それらのオブジェクトのメソッドが実行される可能性さえあるためです。

身を守る方法はいくつかありますが、JSON を使用する方がはるかに簡単です。

于 2009-09-07T15:00:30.597 に答える
3

次のようなことができます:

書く

  • 漬物
  • サイン漬けファイル
  • 終わり

読む

  • pickle ファイルの署名を確認する
  • 解凍する
  • 使用する

データファイルは改ざんされているのに、アプリケーションは改ざんされていないと思うのはなぜですか?

于 2009-09-07T14:59:33.143 に答える
1

私たちが答える前に、より多くのコンテキストを提供する必要があります。どのタイプのデータを保存しているか、どれだけの量があるか、どのようにアクセスしたいか。

きゅうりのピクルスについて:コードを保存しません。関数またはクラスをピクルス化する場合、実際のコード自体ではなく、格納されるのは名前です。

于 2009-09-07T14:53:33.307 に答える
1

http://yserial.sourceforge.netでy_serialモジュールの操作を楽しんでください。

これはチュートリアルのように読めますが、シリアル化と永続化のための実用的なコードを操作上提供します。解説では、ここで提起された問題に関連するいくつかの長所と短所について説明します。

これは、圧縮されたPythonオブジェクトをSQLiteでウェアハウジングするための一般的なソリューションとなるように設計されています(SQLの煩わしさはほとんどありません;-)

お役に立てれば。

于 2009-10-03T02:45:42.750 に答える
1

ピクルス化されたファイルをハッキングしてプログラムを破壊しようとしているソシオパスとは、具体的には誰でしょうか?

パイソンです。ソシオパスにはあなたの情報源があります。pickle ファイルをハッキングする必要はありません。彼らはあなたのソースを編集するだけで、彼らが望むすべての「ダメージ」を与えることができます.

組織犯罪シンジケートとの訴訟に関与していない限り、「不安」について心配する必要はありません。

「不正な保存ファイルがプログラムに有害なコードを挿入する可能性がある」という心配はありません。ソースがあれば、不正な保存ファイルに煩わされることはありません。

于 2009-09-08T00:40:10.287 に答える
1

*****この回答では、アプリケーションの整合性が偶発的に破損することだけを懸念しています.*****

Pickleは「安全」です。安全でない可能性があるのは、たとえばプラグインで、作成していないコードにアクセスすることです。ただし、ピクルスには関係ありません。

オブジェクトをピクルすると、そのデータはすべて保存されますが、コードと実装は保存されません。これは、ピクルを解除すると、更新されたオブジェクトが内部に「古いスタイル」のデータを持っていることに気付く可能性があることを意味します (実装を更新した場合)。これは、該当する場合、知って処理する必要があるものです。

文字列、リスト、数字、辞書のピクルは非常に簡単で、完全に動作し、JSON と同等です。Pickle の魔法は、場合によっては調整なしで、複雑な python オブジェクトでさえも pickle 化できることです。しかし、ピクルス化されるのはデータだけです。インスタンスは、保存されたモジュール名とオブジェクトの型名によって単純に再構築されます。

于 2009-09-07T15:04:53.937 に答える
1

何らかのデータベースを使用する必要があります。pickle 形式で保存することはお勧めできません (ほとんどの場合)。次のことを検討してください。

  • SQLite - (Python 2.5+ に含まれる) 高速でシンプルですが、SQL と DB-API の知識が必要です
  • buzhug - Pythonic 構文を使用した非 SQL のファイルベースのデータベース
  • SQL データベース - 一部の DBMS (MySQL、PostreSQL など) へのインターフェイスを使用できますが、大量のデータ (数千のレコード) にのみ適しています。

ここで他の解決策が見つかるかもしれません。

于 2009-09-07T16:09:03.653 に答える