За последние 24 часа нас посетили 22845 программистов и 1269 роботов. Сейчас ищут 807 программистов ...

авторизация пользователя

Тема в разделе "PHP для новичков", создана пользователем sergq, 14 окт 2018.

  1. sergq

    sergq Новичок

    С нами с:
    14 окт 2018
    Сообщения:
    9
    Симпатии:
    0
    Здравствуйте.

    с php знаком наскоком чуть больше месяца, по этому не сильно пинайте.


    необходимо базово сделать авторизацию пользователя приложения на сервер.

    слегка еще наверно не до конца понимаю механизмы сессии, но алгоритм набросал такой

    если я правильно понял, то при создании сессии в куку кладется уникальный идентификатор сессии в PHPSESSID c временем действия session.gc_maxlifetime. при повторном обращении к скрипту время сессии начинает считаться от времени последнего обращения (или от start_session()). Но вот в куке PHPSESSID срок действия не продлевается на session.gc_maxlifetime.

    1. если в куках нет PHPSESSID, то получаем переданные логин-пароль. GET или POST запросы
    1.1 если логин-пароль НЕ передан, то по сути сессии у нас нет и логина-пароля тоже - не авторизован
    1.2 если логин-пароль передан, то пытаемся авторизоваться
    1.2.1 запрашиваем базу в этим логином-паролем.
    1.2.1.1 если не сошелся логин-пароль выплевываем, что не авторизовался
    1.2.1.2 если сошелся, то выставляем сессионную переменную авторизации и выдаем пользователю, что авторизован. в куки добавляем токен со сроком действия таким же, как и session.gc_maxlifetime
    2. если есть PHPSESSID
    2.1. продлеваем срок действия PHPSESSID на session.gc_maxlifetime и действие токена на session.gc_maxlifetime
    2.2 выдаем пользователю, что авторизован


    логика есть или в конец заработался?)
     
  2. sergq

    sergq Новичок

    С нами с:
    14 окт 2018
    Сообщения:
    9
    Симпатии:
    0
    да, похоже заработался )
    набросал такой скрипт. вроде работает

    PHP:
    1. ini_set('session.cookie_lifetime', 1*60);// это общей куки PHPSESSID
    2. ini_set('session.gc_maxlifetime', 1*60);// это время жизни сессииы
    3.  
    4.  
    5.            
    6.             // получаем  id и пароль, переданный
    7.     if ($_SERVER['REQUEST_METHOD'] == 'GET') {  
    8.         if (!isset($_SESSION['logged'])) {  // не залогинено
    9.             if (isset($_GET['uid']) && isset($_GET['pass']) ) { // если переданы логин-пароль
    10.                 // проверяемся на базе
    11.                 $uid = $_GET['uid'];
    12.                 $pass = $_GET['pass'];              
    13.                 $db = new Database();
    14.                 $db->connect();
    15.                 $db->beginTransaction();
    16.                 $pass = str_replace('"', '', $pass);
    17.                 $pass = str_replace("'", "", $pass);
    18.        
    19.                 $par = '\''.$uid.'\''.','.'\''.$pass.'\'';  
    20.                 $db->ExecProc('SITE_AUTH','pass_int,counter,auth',$par);
    21.                 $res = $db->getJSONResult();
    22.        
    23.                 $db->commit();
    24.                
    25.                 $data = json_decode($res, true);
    26.                
    27.                 if ($data['success'] == false) // тут скорее всего ошибка базы. надо выдать типа на обслуживании
    28.                 {
    29.                     echo('Ошибка на стороне сервера!');
    30.                     session_destroy();
    31.                     return;
    32.                 }              
    33.                
    34.                 if ($data['data'][0]['PASS_INT'] == '') {
    35.                     // тут пустой пароль пришет. значит нет там такого логина
    36.                     echo('Нет такого пользователя!');
    37.                     session_destroy();
    38.                     return;
    39.                 }
    40.                
    41.                 if ($data['data'][0]['COUNTER'] == 1) {
    42.                     // есть . нашли пользователя
    43.                     //echo('33333');
    44.                     if ($data['data'][0]['AUTH'] == 1) {  // пароль подошел
    45.                         /// процедура решила, что аутентифиципровался
    46.                         //                 echo(session_status());                
    47.                         // ставим сессионную переменную
    48.                         $_SESSION['myvar'] = 23123123;
    49.                         setcookie('authC','3333333333333333333333',time()+60*1);
    50.                         //echo($_COOKIE['PHPSESSID']);
    51.                         echo(session_id());                
    52.                         $_SESSION['logged'] = 1;
    53.                         //echo(PHP_SESSION_ACTIVE);
    54.                     }
    55.                     else
    56.                     {
    57.                         echo('Пользователь имеется, но пароль не подошел ');
    58.                         session_destroy();
    59.                         return;
    60.                     }          
    61.            
    62.                 }                
    63.        
    64.             }
    65.         } else
    66.         {// залогинено
    67.             // продлеваем phpsessid
    68.             $_sess_name = session_name();
    69.             $_sess_id = session_id();
    70.             // Update cookie ;)
    71.             setcookie($_sess_name, $_sess_id, time() + 1*60, "/");          
    72.            
    73.             // и продлим токен
    74.             if (isset($_COOKIE["authC"])) {
    75.                 // если есть токен, то продлеваем его
    76.                 $z = $_COOKIE["authC"];
    77.                 setcookie('authC',$z,time()+60*1);
    78.                 // продлилось удачно
    79.             }                      
    80.             echo('Сессия продлена!');
    81.         }
    82.        
    83.  
    84.     }  
     
  3. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    не все смотрел)) но вкратце))

    Если работает с сессиями и куками лучше хранить данные о клиенте в БД
    1. Время жизни кук 7 дней (к примеру) записываем в них что чел прошел аутентификацию
    2. Время жизни нативных сессии это пока сеанс работает
    3. В базу записываем ИД сессии и ставим время записи и туда же записываем IP клиента и параметры браузера (md5($_SERVER['HTTP_USER_AGENT']);) можно даже и IP и юзер агента в один хеш запихнуть и этот же ключ можно при желании положить в куку)
    4. Когда человек заходит сначала смотрим что у нас в нативной сессии лежит.. если там ничего нет читаем куки и смотрим есть ли там наша запись.. если есть то проверяем его IP и хеш юзер агента. если есть и совпадают то восстанавливаем нативную сессию, если нет то предлагаем ввести логин и пароль))

    ПЫСЫ при такой схеме нативные сессии можно даже в базу перенести.. а можно не переносить)) я и так и так делал)) работает одинаково))
     
  4. sergq

    sergq Новичок

    С нами с:
    14 окт 2018
    Сообщения:
    9
    Симпатии:
    0
    пара вопросов все ж есть.
    время сессии нативной начинает считаться от последнего действия я так понимаю. те время сессии 20 минут. через 15 минут бездейтсвия я чего нибудь дернул - время пошло снова?
    Надо ли в данном случае куку и ее содержимое продлевать? по экспериментам вроде как ни моя часть куки ни phpessionid не продлеваются автоматом.

    есть ли какой нибудь сервис бесплатный, в котором можно было б прогнать скрипт на предмет sql injection?
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @sergq, если реально хотите разобраться, может, попробовать сделать все без штатных сессий? Продления и т.п. обычно в логику закладываются. Продлевать лучше не на каждое обращение, а в пределах нек. времени до момента устаревания. Куку, естественно, продлевать нужно, причем можно с запасом, т.к. осн. контроль происходит не по ее времени жизни, а по серверным данным. Спрошу у приятеля, можно ли отобразить его скрытый коммент на эту тему вот тут: http://gency.ru/comment/64 (был скрыт по просьбе автора).

    Штатные сессии обычно используются, пока открыт браузер (спец. значение времени жизни сес. куки и не только). Иначе там до сих пор могут наблюдаться различные глюки, не соотв. документации и т.п.
    --- Добавлено ---
    Вы реально собрались пароль через GET-параметр передавать? :)
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @sergq, если реально хотите разобраться - читайте книги.