2012-03-06 1 views
5

を検索Iは以下のようなPerlのオブジェクト(参照の配列を参照)を有する:は、DB上のオブジェクトを格納し、それを

my $a = [ [$a, $ab, $c ], [$a, $b, $c] ] ; 

をし、それを検索DBに保管する必要があります。

誰かがそれを圧縮してDBに保存するためにもシリアル化する良い仕組みを提案できますか?次にそれを逆シリアル化してコード内で使用しますか?

答えて

7

既知のシリアライザを使用できます。 JSON::XSまたはStorable。リファレンスを値のコピーではなく取得する場合は、 Storableが良いでしょう。次に、ストレージ要件を満たす任意のタイプ(VARCHAR、BLOB、...)のフィールドに直列化オブジェクトを保管します。

use Storable qw(nfreeze thaw); 
use DBI; 

# ... connect to database 
# Store 
my $data = [ [$a, $b, $c ], [ $a, $b, $c ] ]; 
my $bytestream = nfreeze $data; 
$dbh->do('insert into table (field) values(?)', undef, $bytestream); 

# Retrieve 
$bytestream = $dbh->selectrow_array('select field from table where ...'); 
$data = thaw $bytestream; 

また、あなたがIO::Compress::Gzip

my $bytestream = gzip nfreeze $data; 
+0

私はそれを試しましたが、私は以下のエラーが表示されます:unblessed参照でメソッド "nfreeze"を呼び出すことができません – smith

+0

インポートメソッド 'nfreeze'ですか? 'Storable qw(nfreeze)'を使うか、 'Storable :: nfreeze($ data)'メソッドの完全指定名を書いてください。 – Ali

+0

gzipを解凍するモジュールは何ですか? – smith

-1

私はそれを自分で試したことはありませんが、PerldocはData :: Dumperの戻り値が "元の参照構造の同一のコピーを取り戻すために評価"できると述べています。 Dumper出力をデータベースに十分な大きさのテキストフィールドに入れることができます。

+1

-1を経由して、例えば、$bytestreamを圧縮することができ、これは、SQLインジェクション攻撃は、リモートでコードが実行される攻撃にエスカレートすることができるようになります。 'eval STRING'はプログラムが' eval STRING'を呼び出すことによって全体的に生成されないデータに対して非常に慎重に使用するべきです。 –

-1

Data :: Dumperはどうですか? オブジェクトをDBのTEXTフィールドにダンプし、内容を評価して戻すことができます。

+0

-1、これにより、SQLインジェクション攻撃がリモートコード実行攻撃に拡大する可能性があります。 'eval STRING'はプログラムが' eval STRING'を呼び出すことによって全体的に生成されないデータに対して非常に慎重に使用するべきです。 –

+0

私はあなたがこれを念頭に置いておくべきだと同意しますが、OPは彼のデータが生成されたことについて何も言わなかったのです。だから私はData :: Dumperを考慮に入れない理由は見当たらない。 – fenton

+0

私のコメントは、データが*出て来る場所ではなく、どこから来るのかということです。 [Defense in Depth](http://en.wikipedia.org/wiki/Defense_in_depth_%28computing%29)のアイデアは、あるレイヤの穴が次のレイヤを脅かさないようにするため、アプリケーションの各レイヤのセキュリティについて積極的に取り組むことです層。データベースから返されたデータに対して 'eval STRING'を呼び出す場合は、アプリケーションにコードを実行するためにデータベースに完全なアクセス権を与えました。データベースの違反があれば、アプリケーション全体を完全に制御できます。 **データを実行しないでください!** –

関連する問題