【问题标题】:Should I use Storable or FreezeThaw to serialize Perl data as a cookie value?我应该使用 Storable 还是 FreezeThaw 将 Perl 数据序列化为 cookie 值?
【发布时间】:2009-09-09 02:23:23
【问题描述】:

我想将一些数据存储在一个 cookie 中,我最初的想法是自己打包,但后来我想起了万物皆有模块。

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

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

【问题讨论】:

    标签: perl serialization cookies


    【解决方案1】:

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

    【讨论】:

    • 我不打算存储任何重要数据,只存储几个 ID。
    • 在客户端上保持客户端状态,在服务器上保持服务器状态。即使是 REST 设计也是推荐的最佳实践。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          我最终使用 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,
          );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            • 1970-01-01
            • 1970-01-01
            • 2010-12-25
            • 2010-11-03
            • 2010-11-03
            相关资源
            最近更新 更多