За последние 24 часа нас посетили 32709 программистов и 3304 робота. Сейчас ищут 1339 программистов ...

Логика авторизации через сессии.

Тема в разделе "PHP для новичков", создана пользователем Phantik, 25 авг 2009.

  1. Phantik

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

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Здравствуйте форумчане. Возник еще один вопрос по сессиям.
    Хочу сделать авторизацию с помощью сессий, но не совсем разобрался в некоторых нюансах.
    В общем задача в следующем:

    Есть сайт с неким набором страниц Page1.php, Page2.php, .... PageN.php. Задача довольно банальная. Для каждого пользователя эти страницы формируются свои, в зависимости от тех данных, которые он вводил ранее. С моментом регистрации я разобрался. В базе есть таблица куда записываются данные пользователя там логин, пароль, емаил и.т.д.
    Соответственно у каждого пользователя в таблице есть свой уникальный UserID.

    Для того что бы отобразить страничку непосредственно соответствующую конкретному пользователю, я формирую адрес страницы в следующем виде header(location: PageX.php?UserID=123). Далее я в самом скрипте PageX.php через $_GET считываю UserID и через него набираю из базы информацию, соответсвующую данному пользователю и формирую соответствующую страничку.

    Тут сразу возникает очевидная проблема: Любой пользователь вводит адресс http://Мойсайт/PageX.php?UserID=123 и попадает на страницу того пользователя UserID которого он ввел.

    Вообщем надо делать авторизацию. Делаю страницу login.html и скрипт для нее login.php. Из первой во вторую передаю логин и пароль. Проверяю правильность и если данные правильны, то создаю некую переменную в сессии и записываю в нее некое значение: $_SESSION['checklogin'] = 'done'. А далее каждый скрипт PageX.php начинается с проверки существует ли $_SESSION['checklogin']. Если существует то формирую страницу а если нет то посылаю пользователя на login.html.

    Метод тоже не подходит т.к. заполнить переменную сессии я могу входом на свой аккаунт, а потом менять просто UserID и просматривать чужие страницы.

    Далее модифицирую авторизацию следующим образом: Создаю в таблице плльзователей дополнительное поле SessionCode. При авторизации генерирую случайную строку типа "bh2hdah8de" и записываю ее и в сессию и в таблицу базы данных в поле SessionCode. А далее в КАЖДОЙ странице PageX.php сравниваю этот код в сессии и в базе. И формирую результирующую страницу если эти коды совпадают, в противном случае посылаю пользователя на login.html

    Последний вариант с рабочей точки зрения вроде правильный. Но мне кажется что это все делается как-то проще и красивее. Подскажите пожалуйста как это все реализуется. Код особо не нужен, желательно просто на пальцах объяснить логику. Уверен что по этой теме уже сформированы классические решения т.к. это используется в огромном количестве сайтов.
    Заранее спасибо.
     
  2. illiaerne

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

    С нами с:
    22 июл 2009
    Сообщения:
    44
    Симпатии:
    0
    Адрес:
    подстолица
    я конечно не профи, но ведь можно сделать так, что бы в строке не было USER_ID b вообще небыло ничего кроме http://твойсайт/страница1.php, а если дописать всякую ню, типа USER_ID=1134, то ничего происодить не будет.

    если так авторизировать пользователя?
    PHP:
    1.  
    2. <?
    3. $auth_login = $_POST["login"];
    4. $auth_pass = $_POST["pass"];
    5. session_register("auth_login");
    6. session_register("auth_pass");
    7. ?>
    8.  
    а затем делать так
    PHP:
    1.  
    2. <?
    3. $res = mysql_query("SELECT id as id FROM users WHERE login = '".$_SESSION["auth_login"]."'");
    4. $id = mysql_fetch_assoc($result);
    5. if ($id = $(значение нужное для генерации страницы))
    6. {генерируешь страницу;}
    7.  
    8. else{шлешь нахер;}
    9.  
    10. ?>
    11.  
    Чесно, не представляю как поменять id в таком случае...
     
  3. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    illiaerne
    Не используйте session_register !
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    храни в сессии ID
     
  5. illiaerne

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

    С нами с:
    22 июл 2009
    Сообщения:
    44
    Симпатии:
    0
    Адрес:
    подстолица
    Если есть свободная минутка, расскажи почему, а то я неочень... и что лучше использовать?
     
  6. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
  7. illiaerne

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

    С нами с:
    22 июл 2009
    Сообщения:
    44
    Симпатии:
    0
    Адрес:
    подстолица
    т.е. основной причиной является то, что скоро эта функция может быть снесена из пхп в принципе
    и это
    Note: It is currently impossible to register resource variables in a session. For example, you cannot create a connection to a database and store the connection id as a session variable and expect the connection to still be valid the next time the session is restored. PHP functions that return a resource are identified by having a return type of resource in their function definition. A list of functions that return resources are available in the resource types appendix.
    If $_SESSION (or $HTTP_SESSION_VARS for PHP 4.0.6 or less) is used, assign values to $_SESSION. For example: $_SESSION['var'] = 'ABC';


    ?

    а выполнить тоже самое можно так?
    PHP:
    1.  
    2. <?
    3. $_SESSION["auth_login"] = $_GET["login"];
    4. ?>
    5.  
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    register_globals и $HTTP_*_VARS
    тоже можно использовать
     
  9. illiaerne

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

    С нами с:
    22 июл 2009
    Сообщения:
    44
    Симпатии:
    0
    Адрес:
    подстолица
    спасибо, буду знать.

    Соответственно разлогинить, при таком раскладе можно так:
    PHP:
    1. <?unset($_SESSION["auth_login"]);?>
    ?
     
  10. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Он пошутил таким образом.
     
  11. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Apple
    спасибо, буду знать :D
     
  12. illiaerne

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

    С нами с:
    22 июл 2009
    Сообщения:
    44
    Симпатии:
    0
    Адрес:
    подстолица
    Я уже прочитал в мане, про его шутку :)
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
  14. illiaerne

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

    С нами с:
    22 июл 2009
    Сообщения:
    44
    Симпатии:
    0
    Адрес:
    подстолица
    это нормально :lol: будем править, как руки дойдут, будем править :)
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    illiaerne
    там они везде
    смотри, как бы злые люди тебе к этому времени БД не поломали
     
  16. illiaerne

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

    С нами с:
    22 июл 2009
    Сообщения:
    44
    Симпатии:
    0
    Адрес:
    подстолица
    Чесно говоря, пусть ломают, потом буду заниматься прочтением логов и искать что перегрызли :)
    Бэкап льёться каждые пол часа, сохраняется последние 100
     
  17. Phantik

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

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Я правильно все понял?
    В момент авторизации, если логин + пароль верны, то я записываю в сессию значение UserID. А далее переходя на любую страницу PageX.php, я в начале скрипта, проверяю существует ли соответствующая переменна сессии. Если существует, то считываю ее значение и через него работаю с базой и формирую страницу. Если нет то посылаю пользователя на login.html. При этом мне становится не нужно передавать UserID через GET?

    Если это все верно то возникает еще 2 вопроса:
    1) Если я каким-либо образом узнаю UserID другого пользователя и его session_ID, то я могу получить доступ к его данным при таком типе авторизации?

    2) Как сделать так, что бы login.html отправляла логин и пароль по протоколу https?