perl 如何强制CGI用双引号将cookie值括起来

a5g8bdjr  于 2023-02-13  发布在  Perl
关注(0)|答案(3)|浏览(151)

为了进行简单的演示,让我们使用以下Perl代码:

use strict;
use warnings;

use CGI qw /:standard/;
use MIME::Base64;

# ...

my $cookie = cookie( -name    => 'token',
                     -value   => '"' . encode_base64($token) . '"',
                     -expires => '+1y',
                   );

print header( -status    => 302,
              'Location' => $uri,
              -cookie    => $cookie,
            );

此脚本将生成以下HTTP标头:

不过,我以为

设置Cookie:token="lrv5Jy5KhkXb8qIWpgd3bA==";路径=/;过期=...

我应该怎么做才能获得所需的cookie格式?

xmq68pz9

xmq68pz91#

cookie值周围的引号是可选的。CGI模块的作者选择不包括引号,也不提供API选项来打开引号。
您尝试将引号作为值的 * 部分 * 而不是分隔它的字符。
如果希望包含可选引号,则需要重新实现cookie sub。

uinbv5nw

uinbv5nw2#

未测试,但您可以尝试

use CGI qw /:standard/;
$CGI::Q = $CGI::DefaultClass->new;
$CGI::Q->{escape} = 0;
# ...

https://metacpan.org/module/CGI::Util/source#L83

push @$result, make_attributes( $leftover, defined $CGI::Q ? $CGI::Q->{escape} : 1 )
hgqdbh6s

hgqdbh6s3#

溶液#1:
print header( 
  -status      => 302,
  'Location'   => $uri,
  'Set-Cookie' => 'token="' . encode_base64($token) =~ s/\n$//r . '"; ' .
                  'path=/; expires=' . (POSIX::strftime 
                  "%a, %d-%b-%Y %T GMT", gmtime (time + 365*24*60*60)) # +1y
            );
溶液#2:
$token = encode_base64($token) =~ s/\n$//r; 

my $cookie = cookie( -name    => 'token',
                     -value   => '',
                     -expires => '+1y',
                   )
                   =~ s/=;/="$token";/r;

print header( -status    => 302,
              'Location' => $uri,
              -cookie    => $cookie,
            );

相关问题