我应该使用Storable还是FreezeThaw将Perl数据序列化为cookie值?
我想将一些数据存储在一个cookie中,我的初始虽然是自己打包的,但后来我想起了有一个一切模块。我看过Storable
和FreezeThaw
。两者似乎都是合适的,尽管后者专门提到了字符串,并且似乎将序列化为没有换行符的字符串,而Storable创建了一个包含换行符的字符串。我应该使用Storable还是FreezeThaw将Perl数据序列化为cookie值?
哪个模块最适合我的应用程序,还是有什么更合适的?
如果将数据存储在cookie中确实是您想要做的事情,并且会话不合适,我会使用Storable
加上MIME::Base64
来使数据保持cookie安全。可能在添加Digest::HMAC
用于防篡改和/或Crypt::Rijndael
以使数据对用户完全不透明(视情况而定)。
出于安全性和兼容性的原因,将大量数据存储在客户端Cookie中通常不是一个好主意。相反,我会推荐使用类似CGI::Session的东西,它会给你自动会话cookie,并且你可以将数据存储在服务器端的表或文件中。那么使用什么序列化方法并不重要。
我不打算存储任何重要数据,只是几个ID。 – 2009-09-06 06:22:50
在客户端保持客户端状态,在服务器上保持服务器状态。即使是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数据。所以,不要使用任何一个模块。 :)
简答:不要这样做。 – 2009-09-08 18:24:22