我应该使用Storable还是FreezeThaw将Perl数据序列化为cookie值?

问题描述:

我想将一些数据存储在一个cookie中,我的初始虽然是自己打包的,但后来我想起了有一个一切模块。我看过StorableFreezeThaw。两者似乎都是合适的,尽管后者专门提到了字符串,并且似乎将序列化为没有换行符的字符串,而Storable创建了一个包含换行符的字符串。我应该使用Storable还是FreezeThaw将Perl数据序列化为cookie值?

哪个模块最适合我的应用程序,还是有什么更合适的?

+0

简答:不要这样做。 – 2009-09-08 18:24:22

如果将数据存储在cookie中确实是您想要做的事情,并且会话不合适,我会使用Storable加上MIME::Base64来使数据保持cookie安全。可能在添加Digest::HMAC用于防篡改和/或Crypt::Rijndael以使数据对用户完全不透明(视情况而定)。

出于安全性和兼容性的原因,将大量数据存储在客户端Cookie中通常不是一个好主意。相反,我会推荐使用类似CGI::Session的东西,它会给你自动会话cookie,并且你可以将数据存储在服务器端的表或文件中。那么使用什么序列化方法并不重要。

+0

我不打算存储任何重要数据,只是几个ID。 – 2009-09-06 06:22:50

+0

在客户端保持客户端状态,在服务器上保持服务器状态。即使是REST设计也是最好的做法。 – 2009-09-06 10:34:01

Storable和FreezeThaw都可以产生不可打印或其他有问题的字符以及换行符。但是大多数将为您生成并解析cookie标头的模块将自动编码需要它的任何字符,因此您不必担心它。

但我会推荐存储更复杂的数据服务器端。

我结束了使用可存储并把它变成一个cookie之前的结果加密:

use CGI::Cookie; 
use Storable qw(freeze); 
use Crypt::CBC; 

my $data = { 
    'ID' => 7, 
    'foo' => 'bar', 
}; 

my $cipher = Crypt::CBC->new(
    -cipher => 'Rijndael', 
    -header => 'none', 
    -key => $key, 
    -iv  => $iv, 
); 

my $enc = $cipher->encrypt_hex(freeze($data)); 
my $cookie = CGI::Cookie->new(
    -name => 'oatmeal', 
    -value => $enc, 
); 

真实的数据不要存放在cookie中。存储一些标识符,允许您在服务器端查找cookie数据。所以,不要使用任何一个模块。 :)