2010-01-28 2 views
0

Хорошо, так как это работает пользователь выполняет проверку подлинности с помощью веб-формы и формирует идентификатор сеанса, как так:Есть ли недостатки в моем процессе обработки веб-сеансов?

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.

ответ

4

Использование CGI::Session. См. Также CGI::Application::Plugin::Session.

  • Состояние гонки в session_open.

  • Включает ли ваш код обработки сеанса любую другую информацию сессии в файл сеанса?

  • В check_sid у вас есть my $sid = shift;, но вы пытаетесь открыть "$SDIR/$pid".

  • Даже если вы правильно назвали переменную, которая будет интерполирована в имя файла, есть очевидный недостаток, что вы не скрываете идентификатор сеанса (т. Е. Вы доверяете неконтролируемому вводу). Объедините это с тем фактом, что вы используете две аргумента формы open, и интересные возможности присутствуют.

В любом случае, нет причин для того, чтобы кто-либо писал код обработки сеанса. Работа выполнена для вас. Не изобретайте велосипед.

+0

Я добавил семафор session_open, но это решает проблему? Я никогда не понимал, работает ли LOCK_EX в нескольких экземплярах вызываемого сценария. Также я не нашел пример где-нибудь из CGI :: Session, где вы можете просто передать идентификатор сеанса с каждой страницы и использовать его. Любые примеры, которые я видел с CGI, всегда передают имя пользователя/пароль в скрытых полях и регистрируют пользователя снова, какие-либо хорошие руководства, о которых вы знаете? – user105033

+0

Кроме того, он не позволяет писать какую-либо другую информацию о сессии, это не «сеанс», а скорее механизм отсутствия необходимости отправлять закодированный пароль со страницы на страницу, чтобы определить, зарегистрирован ли пользователь или нет. , Мне действительно не нужно хранить какие-либо фактические данные сеанса. – user105033

+1

@unknown Смотрите пример 'CGI :: Application :: Plugin :: Session' или' CGI: Session' docs: передайте текущий экземпляр '$ cgi' в конструктор' CGI :: Session'. Нет смысла передавать данные имени пользователя и пароля в скрытые поля.Кроме того, если вам не нужно хранить информацию о сеансе, почему бы не использовать HTTP-аутентификацию? –

9

Вы не можете принять соответствие 1-1 между пользователями и IP-адресами. Несколько человек могут войти с одного и того же IP-адреса (за прокси-сервером). Может быть задействовано несколько IP-адресов (пользователь переходит через сбалансированный по нагрузке или обратный прокси-сервер).

Любая попытка смешать IP-адреса в схеме сеанса в конечном итоге сломается, когда вы меньше всего этого ожидаете, поэтому не делайте этого.

Если вы заботитесь о сеансах, используйте SSL.

+0

Точка ADDR не должна была обеспечивать 1-1 coorepondence, но добавить еще один уровень безопасности, я думаю, если кто-то получил идентификатор сеанса людей, им также нужно было бы знать, что люди IP и пользовательский клиент. (хотя, если у них есть идентификатор сеанса, они, вероятно, уже знают ip ...) – user105033

+0

Точка Рэндала заключалась в том, что один пользователь может иметь более одного IP-адреса в течение одного сеанса. Связывание сеанса с определенным IP-адресом вызовет проблемы для этих пользователей. – cjm

+0

oh okay i see .. – user105033

Смежные вопросы