我想将一些数据存储在一个cookie中,而我最初的想法是自己打包,但后来我记得那里有一个模块可供所有人使用。
我查看了Storable
和FreezeThaw
。两者看起来都合适,虽然后者特别提到了字符串,似乎序列化为没有换行符的字符串,而Storable创建了一个包含换行符的字符串。
哪个模块最适合我的应用程序,还是有更合适的东西?
答案 0 :(得分:4)
出于安全性和兼容性原因,在客户端cookie中存储大量数据通常不是一个好主意。相反,我建议使用类似CGI::Session的东西,它会为您提供自动会话cookie,您可以将数据存储在服务器端的表或文件中。那么你使用什么序列化方法并不重要。
答案 1 :(得分:3)
如果将数据存储在cookie中确实是您想要做的,并且会话不合适,我会使用Storable
加MIME::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,
);