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

时间:2009-09-06 01:58:10

标签: perl serialization cookies

我想将一些数据存储在一个cookie中,而我最初的想法是自己打包,但后来我记得那里有一个模块可供所有人使用。

我查看了StorableFreezeThaw。两者看起来都合适,虽然后者特别提到了字符串,似乎序列化为没有换行符的字符串,而Storable创建了一个包含换行符的字符串。

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

但我建议在服务器端存储更复杂的数据。

答案 4 :(得分:2)

我最终使用Storable并在将结果放入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,
);