Хорошо, так как это работает пользователь выполняет проверку подлинности с помощью веб-формы и формирует идентификатор сеанса, как так:Есть ли недостатки в моем процессе обработки веб-сеансов?
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;
}
на заднем плане у меня есть хроны запустить сценарий каждые 5 минут истекающих сессии 2 часа старые:
foreach (<../session/*>)
{
unlink $_ if -M $_ > 0.08333;
}
Есть ли недостатки, ненужные шаги, которые я предпринимаю здесь? Я решил использовать user_agent и remote_addr, так как было бы труднее подключить идентификатор сеанса someones.
Я добавил семафор session_open, но это решает проблему? Я никогда не понимал, работает ли LOCK_EX в нескольких экземплярах вызываемого сценария. Также я не нашел пример где-нибудь из CGI :: Session, где вы можете просто передать идентификатор сеанса с каждой страницы и использовать его. Любые примеры, которые я видел с CGI, всегда передают имя пользователя/пароль в скрытых полях и регистрируют пользователя снова, какие-либо хорошие руководства, о которых вы знаете? – user105033
Кроме того, он не позволяет писать какую-либо другую информацию о сессии, это не «сеанс», а скорее механизм отсутствия необходимости отправлять закодированный пароль со страницы на страницу, чтобы определить, зарегистрирован ли пользователь или нет. , Мне действительно не нужно хранить какие-либо фактические данные сеанса. – user105033
@unknown Смотрите пример 'CGI :: Application :: Plugin :: Session' или' CGI: Session' docs: передайте текущий экземпляр '$ cgi' в конструктор' CGI :: Session'. Нет смысла передавать данные имени пользователя и пароля в скрытые поля.Кроме того, если вам не нужно хранить информацию о сеансе, почему бы не использовать HTTP-аутентификацию? –