Хорошо, так как это работает, пользователь аутентифицируется через веб-форму и генерирует идентификатор сеанса следующим образом:
sub session_open
{
my $sid;
my $user = shift;
if ( open(SEMA, "> ../sema/sess") )
{
flock SEMA, LOCK_EX;
do
{
$sid = generate_session_id();
}
while ( -d "$SDIR/$sid" );
my $sstr = "$user:$ENV{'HTTP_USER_AGENT'}";
write_file('>', "$SDIR/$sid", $sstr);
close SEMA;
}
return $sid;
}
Идентификатор сеанса затем передается на каждую страницу в URL, если файл сеансасуществует и проверяет его по своему пользовательскому агенту и удаленному адресу, что позволяет пользователю продолжить:
sub check_sid
{
my $sid = shift;
return 0 if $sid =~ /[^\w\d]/;
return 0 if !open(SID, "< $SDIR/$pid");
my ($user, $agent) = split /:/, <SID>, 2;
close SID;
return 0 if $agent ne $ENV{'HTTP_USER_AGENT'}";
return $user;
}
В фоновом режиме у меня есть задание cron, запускающее скрипт каждые 5 минут, истекающие сеансы 2 часа назад:
foreach (<../session/*>)
{
unlink $_ if -M $_ > 0.08333;
}
Есть ли здесь какие-то недостатки, ненужные шаги?Я решил использовать user_agent и remote_addr, поскольку было бы сложнее поднять кому-то идентификатор сессии таким образом.