我想將一些數據存儲在一個cookie中,我的初始雖然是自己打包的,但後來我想起了有一個一切模塊。我看過Storable
和FreezeThaw
。兩者似乎都是合適的,儘管後者專門提到了字符串,並且似乎將序列化爲沒有換行符的字符串,而Storable創建了一個包含換行符的字符串。我應該使用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