CGI :: Session随机清除参数

时间:2014-10-16 10:19:17

标签: perl session cookies cgi

当用户登录时,我在Perl CGI中创建了一个新会话,并将会话ID存储在cookie(CGISESSID)中。然后通过重定向将该cookie发送到下一页,如下所示:

my $session = CGI::Session->new("driver:File", undef, {Directory=>"/tmp"});
my $sid = $session->id();
$session->param("username", $username);
$session->expire('+15m');
print redirect ( -cookie => cookie(CGISESSID => $session->id), -uri => 'x.cgi');

On' x.cgi' (以及网站的所有其他页面)我有:

my $sid = cookie ('CGISESSID') || param('CGISESSID') || undef;
my $session = CGI::Session->load(undef, $sid, {Directory=>'/tmp'});
$session->expire('+15m');
my $username = $session->param("username");
if (!defined ($username)) {
    print redirect ("login.cgi");
}

但是,在随机的时间/点击之后(远在15米标记之前,从第一次点击到2-3分钟之后的点击),它会重定向到login.cgi。

调试告诉我,虽然它重定向了我(并且没有定义$ username),但代码仍然获得了最初创建的正确会话ID(会话似乎仍然完好无损),并且cookie仍然存在。

我没有将CGISESSID作为参数传递给任何页面请求/链接(因为我认为cookie可以避免这样做)

任何想法可能导致$ username在一段随机时间后未定义?

1 个答案:

答案 0 :(得分:1)

鉴于您的描述是正确的并且您的代码工作了一段时间,然后停止工作,我建议检查没有人正在清理您的/tmp目录,特别是那里的会话文件。 / p>

当您使用带有CGI::Session驱动程序的file模块创建会话时,它只会在给定目录中创建一个文本文件(代码中为/tmp)。这是一个包含一些Perl代码的文本文件,您可以cat查看它内部的内容:

$ cat cgisess_126b3cd2c4b9ac6eaac0185afbc46d34 && echo
$D = {'_SESSION_ID' => '126b3cd2c4b9ac6eaac0185afbc46d34','_SESSION_ATIME' => 1413493418,'_SESSION_REMOTE_ADDR' => '','_SESSION_CTIME' => 1413493418};;$D

对于file驱动程序,可以通过

获取它用于会话的文件名
my $filename = sprintf $CGI::Session::Driver::file::FileName, $session->id;

检查它是否已创建且存在至少15分钟。如果它消失了,则责怪一些cron作业,其他一些脚本或你的托管服务提供商。