【发布时间】:2009-09-09 02:23:23
【问题描述】:
我想将一些数据存储在一个 cookie 中,我最初的想法是自己打包,但后来我想起了万物皆有模块。
我查看了Storable 和FreezeThaw。两者似乎都合适,尽管后者特别提到了字符串并且似乎序列化为没有换行符的字符串,而 Storable 创建了一个包含换行符的字符串。
哪个模块最适合我的应用程序,或者有什么更合适的?
【问题讨论】:
标签: perl serialization cookies
我想将一些数据存储在一个 cookie 中,我最初的想法是自己打包,但后来我想起了万物皆有模块。
我查看了Storable 和FreezeThaw。两者似乎都合适,尽管后者特别提到了字符串并且似乎序列化为没有换行符的字符串,而 Storable 创建了一个包含换行符的字符串。
哪个模块最适合我的应用程序,或者有什么更合适的?
【问题讨论】:
标签: perl serialization cookies
出于安全和兼容性的原因,在客户端 cookie 中存储大量数据通常不是一个好主意。相反,我建议使用CGI::Session 之类的东西,它会为您提供自动会话cookie,并且您可以将数据存储在服务器端的表或文件中。那你用什么序列化方法就无所谓了。
【讨论】:
如果将数据存储在 cookie 中确实是您想要做的,并且会话不合适,我会选择 Storable 加上 MIME::Base64 以使数据 cookie 安全。可能会添加Digest::HMAC 用于防篡改和/或Crypt::Rijndael 以使数据对用户完全不透明,视情况而定。
【讨论】:
不要将真实数据存储在 cookie 中。存储一些标识符,使您可以在服务器端查找 cookie 数据。所以,不要使用任何一个模块。 :)
【讨论】:
Storable 和 FreezeThaw 都可以生成不可打印或其他有问题的字符,以及换行符。但是大多数会为您生成和解析 cookie 标头的模块会自动对任何需要它的字符进行编码,因此您不必担心。
但我不赞成在服务器端存储更复杂数据的建议。
【讨论】:
我最终使用 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,
);
【讨论】: