Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сессии в Перле, Что такое сессии и как их писать? 
:(
    Опции темы
izek
Дата 22.1.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


мозговой штурман
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 4.2.2006

Репутация: нет
Всего: нет



Я делал админку и напаролся на проблемму с входом только с  моим например паролем и юзером!Мне сказали что есть сессии для этого я вот не знаю как их писать.Помогите плиз! smile 
PM MAIL ICQ   Вверх
Materium
Дата 22.1.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 4.12.2006
Где: Питер

Репутация: нет
Всего: 2



Зачем сессии? Если я не ошибаюсь всё проще. Проверяй что-нибудь на соответствие тебе и всё.
Или объясни суть проблемы подробнее. Где админка, в чём, для чего... почему просто незя сделать что-то при соответствии твоему паролю и т.д.  smile

Добавлено @ 18:31 
А так в принципе тока себя впустить бесконечное многообразие инструментов для этого.
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
nitr
Дата 22.1.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



izek, глянь рядом...
http://forum.vingrad.ru/index.php?showtopi...t&p=1006394

Совет дня: Пользуйтесь поиском ;)


--------------------
PM   Вверх
izek
Дата 24.1.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


мозговой штурман
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 4.2.2006

Репутация: нет
Всего: нет



Я хотел чтобы страница куда я вхожу была с уникальным кодом чтоб нельзя было взломать админку. Номер сессии или тоже уникальное число будет записываться в куки и он будет удаляться через определённое время. А уникальное число будет генирироваться когда срок действия куки заканчивается!Вот в чём заключалась задача!
Materium, вот так я хотел сделать.    smile

Это сообщение отредактировал(а) izek - 24.1.2007, 12:42
PM MAIL ICQ   Вверх
izek
Дата 24.1.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


мозговой штурман
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 4.2.2006

Репутация: нет
Всего: нет



Ктонибудь мне поможет с одной штукой?
Проблемма в том что он не гинерирует число и проходит мимо условия.В чём проблемма?

Код

if ($ses_id eq 'sesian'){
    if ($pass eq 'password' and $login eq 'login' ){
        my $ses_id = rand(123789);
    } 
    elsif ($pass ne 'password' or $login ne 'login')    {
        print "пароль или логин неверны";
        exit (0);
    }    
    }


а если я добавляю elsif то он его выполняет.  smile 

Код

if ($ses_id eq 'sesian'){
    if ($pass eq 'password' and $login eq 'login' ){
        my $ses_id = rand(123789);
    } 
    elsif ($pass ne 'password' or $login ne 'login')    {
        print "пароль или логин неверны";
        exit (0);
    }    
    }
elsif ($ses_id ne 'sesian'){
        print "нет введения сессии";
        exit (0);
}


Это сообщение отредактировал(а) izek - 24.1.2007, 13:35
PM MAIL ICQ   Вверх
amg
Дата 24.1.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 1
Всего: 50



Не совсем понятен вопрос, но может, проблема в my? Проверяемое тобой $ses_id и $ses_id, которому ты присваиваешь случайное число - это не имеющие отношения друг к другу переменные.

А замечания по коду можно?

Это сообщение отредактировал(а) amg - 24.1.2007, 13:56
PM MAIL   Вверх
djkostya
Дата 24.1.2007, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.5.2006
Где: Москва

Репутация: 1
Всего: 2



Работает так создаёшь сессию туда пишешь пароль и логин, номер сессии кидаешь в куку юзера.
Второй при входе принемаешь куку ишешь номер сессии по этой сессии вытаскиваешь логин и пароль...
Проверяешь по логину и паролю валиден ли юзер..

http://search.cpan.org/~cwest/Apache-Session-1.81/Session.pm
http://search.cpan.org/~markstos/CGI-Sessi.../CGI/Session.pm


Я лично пользуюсь CGI::Session так как не надо заботиться о удалении сессии она сама их удаляет, плюс можно ставить таймаут сессии....
PM MAIL WWW ICQ   Вверх
izek
Дата 25.1.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


мозговой штурман
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 4.2.2006

Репутация: нет
Всего: нет



Пасибо огромное!  smile
PM MAIL ICQ   Вверх
Marlik
Дата 25.2.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 25.2.2007
Где: Рязань

Репутация: нет
Всего: нет



Цитата(djkostya @ 24.1.2007,  18:02)
Работает так создаёшь сессию туда пишешь пароль и логин, номер сессии кидаешь в куку юзера.
Второй при входе принемаешь куку ишешь номер сессии по этой сессии вытаскиваешь логин и пароль...
Проверяешь по логину и паролю валиден ли юзер..

А прикинь если куки стырены, то как определить тот-ли это клиент или не тот, или к примеру у него куки периодически стираются, затруднительно.

Я делаю так: так как сессия нужна исключительно для временного коннекта(посылаем/принимаем), то, создаем сессию и запоминаем в ней все что можно, размер сапога даже если понадобится.

 Далее кладем в hidden индентификатор сессии и все. Теперь что-бы определить кто он вынем оттуда циферки и сравним и все. 

Ну а пароль храним на винте шифрованный посредством функции crypt(); , куки по моему надо избегать.
PM WWW Skype   Вверх
Nab
Дата 26.2.2007, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 8
Всего: 37



Цитата(Marlik @  25.2.2007,  18:22 Найти цитируемый пост)
А прикинь если куки стырены, то как определить тот-ли это клиент или не тот, или к примеру у него куки периодически стираются, затруднительно.Я делаю так: так как сессия нужна исключительно для временного коннекта(посылаем/принимаем), то, создаем сессию и запоминаем в ней все что можно, размер сапога даже если понадобится. Далее кладем в hidden индентификатор сессии и все. Теперь что-бы определить кто он вынем оттуда циферки и сравним и все. Ну а пароль храним на винте шифрованный посредством функции crypt(); , куки по моему надо избегать.

У Вас уважаемый какоето предубеждение против кук smile
Скрытые поля стырить еще проще, чем куку. Потом, если это не форма с POST методом, то номер сессии будет в url виден, вариант ничем не лучше и не хуже куки... кстати часто применяемый когда куки клиентом не поддерживаются ...

А вот куку зато можно передавать шифрованную, тут большой плюс получается, и она нигде видна не будет... И потом как правило проверяют не только номер сессии но и IP к примеру и многое другое можно проверять, все зависит от необходимой степени секретности...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
djkostya
Дата 27.2.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.5.2006
Где: Москва

Репутация: 1
Всего: 2



Код


my $session_ip_addr = $session->param("_SESSION_REMOTE_ADDR");

if("$ENV{'REMOTE_ADDR'}" ne "$session_ip_addr"){
     print "Ну не тот IP с которого была создана сессия";
     exit;
}





PM MAIL WWW ICQ   Вверх
Marlik
Дата 1.3.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 25.2.2007
Где: Рязань

Репутация: нет
Всего: нет



Цитата(Nab @ 26.2.2007,  01:34)
А вот куку зато можно передавать шифрованную, тут большой плюс получается, и она нигде видна не будет... И потом как правило проверяют не только номер сессии но и IP к примеру и многое другое можно проверять, все зависит от необходимой степени секретности...

В принципе, может ты и правильно говоришь, но подумай, я при регистрации или просто коннекте считываю внутренние переменные сохраняю это в сессию, идентификатор кладу в hidden. Затем я просто проверяю все, и IP и все остальное... Другой вопрос, в куки это сохранить или вложить в страницу, тоже вопрос сложный... 

Ну и поимел ты к примеру мой идентификатор, то бишь номер сессии, а ты уверен что внутренние переменные твоего компа совпадут с моими? Соответственно можно и пасворд вложить в сессию закриптованный.

P. s. Не люблю куки и все тут... 
PM WWW Skype   Вверх
Nab
Дата 2.3.2007, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 8
Всего: 37



Цитата(Marlik @  1.3.2007,  23:40 Найти цитируемый пост)
P. s. Не люблю куки и все тут... 

С этого и надо было начинать smile

А в куках люди не боящиеся их smile обычно тот же идентификатор и хранят, который ты предлагаешь в скрытое поле запихнуть...

Но как я говорю у кук чуть больше плюсов, это и шифрование и время жизни...



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
izek
Дата 2.3.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


мозговой штурман
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 4.2.2006

Репутация: нет
Всего: нет



Я сообразил и написал такую штуку!

Код


        ###############################################
        #        Authentification module                                #
        #                    24.01.07                                           #
        ###############################################

    

sub auth {
    my ($sesid, $login, $pass) = @_;
    
    if ($sesid){
        # sesid есть!
        my $status = sesid_check($sesid);
        # Проверяем что показала проверка валидности
        if ($status){
            # Сессия валидна
            # Продолжить сессию
            sesid_update($sesid);
            return $sesid;
        } else {
            # сессия ошибочна
            return 0;
        }
    } else {
        # Если нет сессии то должны быть логин с паролем
        
        my $sql = "SELECT 
            id,
            login,
            pass
        FROM 
            " . $prefix . "_users
        WHERE
            pass    = '$pass'
            AND
            login    = '$login'
        LIMIT 1";
        my $ref = mysql_request_new($sql);
        my $hash = @{$ref}[0];
        
        if ($hash){
            # Такой чел есть
            my $sesid = sesid_start($login);
            return $sesid;
        } else {
            # Такого чела нет
            return 0;
        }
    }
    
    
}

sub sesid_check {
    my $sesid = shift;
    
    # Процедура определения валидности сессии
    
    my $sql = "SELECT 
            id,
            user_id,
            last_time,
            ip
        FROM 
        " . $prefix . "_sesid
        WHERE
            sesid = '$sesid'
        LIMIT 1";
    my $ref = mysql_request_new($sql);
    my $hash = @{$ref}[0];

    return 0 unless $hash;
    
    # Проверяем не старая ли сессия
    
    if (($hash->{last_time} + $session_live_time*60) < time()){
        # Сессия старая
        return 0;
    } else {
        # Сессия нормальная
        # Проверяем следующие условия
        
        # Сверяем IP адрес
        
    my $ip = $ENV{REMOTE_ADDR};
        
        if ($ip ne $hash->{ip}){
            # Ошибка
            return 0;
        } else {
            # Сессия ХОРОШАЯ
            return 1;
        }
    }    
}

sub sesid_start {
    my $login = shift;
    
    my $sql = "SELECT 
            id
        FROM 
            " . $prefix . "_users
        WHERE
            login    = '$login'
        LIMIT 1";
    my $ref = mysql_request_new($sql);
    my $hash = @{$ref}[0];
    
    my $user_id = $hash->{'id'};
    
    my $ip = $ENV{REMOTE_ADDR};
    my $sesid = rand(345973405239057);
    foreach ($sesid){
        $_ =~ s/1/A/gm;
        $_ =~ s/2/N/gm;
        $_ =~ s/3/G/gm;
        $_ =~ s/5/f/gm;
    }
    my $sql = "INSERT INTO " . $prefix ."_sesid
                (
                    sesid,
                    user_id,
                    last_time,
                    ip
                )
                VALUES
                (
                    '$sesid',
                    $user_id,
                    " . time() . ",
                    '$ip'
                )";
    mysql_request_new ( $sql );
    return $sesid;
}

sub sesid_update {
    my $sesid = shift;
    
    my $sql = "UPDATE " . $prefix . "_sesid
        SET last_time = " . time() . "
        WHERE sesid = '$sesid'";
    my $ref = mysql_request_new( $sql );
}
    
1;

Многовато но работает!

Это сообщение отредактировал(а) izek - 2.3.2007, 14:36
PM MAIL ICQ   Вверх
frenkys
Дата 7.3.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 18.6.2005

Репутация: нет
Всего: 1



айди сессий у тебя будут разной длинны ну и иногда рандом возвращеает не целые числа
--------------------
 niva[frenky]
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.