Есть ли недостатки в моем процессе обработки веб-сессии? - PullRequest
0 голосов
/ 29 января 2010

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

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, поскольку было бы сложнее поднять кому-то идентификатор сессии таким образом.

Ответы [ 2 ]

9 голосов
/ 29 января 2010

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

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

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

4 голосов
/ 29 января 2010

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

  • В session_open.

  • Позволяет ли ваш код обработки сеанса записывать какую-либо другую информацию о сеансе в файл сеанса?

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...