pickle.load()がモジュールに依存しないようにオブジェクトをピクルスする特定の方法はありますか?オブジェクトの選択を解除しているときに、Pickleがオブジェクトのクラス定義を含むモジュールをロードしようとしていることを読みました。これを回避して、pickle.load()がモジュールをロードしようとしないようにする方法はありますか?
2 に答える
少し関係がないかもしれませんが、ドキュメントから引用します:
警告 pickle モジュールは、誤ったデータや悪意を持って作成されたデータに対して安全であることを意図していません。信頼できない、または認証されていないソースから受け取ったデータを unpickle しないでください。
余分なモジュールのロードを回避するカスタム unpickler を作成する必要があります。一般的なアプローチは次のとおりです。
- サブクラス化してカスタム unpickler を派生させる
pickle.Unpickler
- オーバーライド
find_class(..)
- ロード
find_class(..)
する必要があるモジュールとクラスを確認します。エラーを発生させてロードを回避します。 - このカスタム クラスを使用して、文字列から unpickle します。
これは、ピクルスを使用する危険性に関する優れた記事です。上記のアプローチを持つコードも見つかります。
オブジェクトのシリアル化と逆シリアル化がピクル機能の主な目的であるため、あなたが求めていることはあまり意味がありません。別のものが必要な場合: オブジェクトを XML または JSON (またはその他の適切な形式) にシリアル化または逆シリアル化します。
たとえば lxml.objectify があります。または、「Python serialize json」または「Python serialize xml」をグーグルで検索します...しかし、クラス定義がなければ、ピクルからオブジェクトを逆シリアル化することはできません-少なくとも、さらにコーディングする必要はありません。
http://docs.python.org/library/pickle.html
カスタム unpickler の書き方を文書化しています...おそらくそれは開始するのに良い方法ですが、これは間違った方法のように見えます。