代码之家  ›  专栏  ›  技术社区  ›  Drew Stephens

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

  •  2
  • Drew Stephens  · 技术社区  · 15 年前

    我想把一些数据存储在一个cookie中,但我最初的想法是自己打包,但后来我记得有一个模块可以处理所有的事情。

    我都看过了 Storable FreezeThaw . 这两种方法看起来都很合适,尽管后者特别提到字符串,并且似乎序列化为一个没有换行的字符串,而storable创建了一个包含换行的字符串。

    哪个模块最适合我的应用程序,或者是否有更合适的模块?

    5 回复  |  直到 15 年前
        1
  •  3
  •   Brad Gilbert    15 年前

    如果你真的想把数据存储在cookie中,而会话不合适,我会同意 Storable MIME::Base64 使数据cookie安全。可能加上 Digest::HMAC 防篡改和/或 Crypt::Rijndael 使数据对用户完全不透明(视情况而定)。

        2
  •  4
  •   friedo    15 年前

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

        3
  •  3
  •   brian d foy    15 年前

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

        4
  •  2
  •   ysth    15 年前

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

    不过,我还是建议在服务器端存储更复杂的数据。

        5
  •  2
  •   Drew Stephens    15 年前

    我最终使用了可存储和加密结果,然后将其放入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,
    );