За последние 24 часа нас посетили 24193 программиста и 1654 робота. Сейчас ищут 863 программиста ...

Авторизация вместе с сессиями.

Тема в разделе "PHP для новичков", создана пользователем iNEEdhLw, 15 апр 2015.

  1. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    предисловие:вообще не понимаю я этих кук/сессий. мне кажется, что одно спокойно может обходиться без другого для поставленной задачи (авторизации) - но ведь это не так...разжуйте, а? прочёл много, но не въезжаю окончательно.

    з.ы. скрипты в итоге выдают "na" (последний елсе)
    handler.php:
    Код (PHP):
    1. class authorization{
    2.     static public $login;
    3.     static public $password;
    4.     static public $users_id;
    5.     
    6.     static public function check_log($login, $password){
    7.         self::$login = mysqli_real_escape_string(database::get_instance(),$login);
    8.         self::$password = mysqli_real_escape_string(database::get_instance(),$password);
    9.  
    10.         $result = mysqli_query(database::get_instance(), "SELECT `users_id` from users WHERE `users_login`="."'".self::$login."' and 
    11.             `users_password`="."'".self::$password."'");
    12.         $tmp = mysqli_fetch_assoc($result);
    13.         if ($tmp != NULL){
    14.             
    15.             $_SESSION['authorization'] = $tmp[1];
    16.              header("location: index.php");   
    17.         }else{
    18.             echo "Такой пользователь не зарегистрирован!";
    19.         }
    20.     } 
    21.  
    22. // вызов метода-проверки пользователя 
    23.  
    24. if (isset ($_POST['log']) and isset ($_POST['pas'])){
    25.         $connect = database::get_instance();
    26.                     if ($connect){
    27.    authorization::check_log($_POST['log'], $_POST['pas']);
    28.   
    29.                             }
    30.                     }
    index.php:
    Код (PHP):
    1.  include 'modal-window.php';
    2. if (isset($_SESSION['authorization'])){
    3.     echo "<p>Вы вошли как ".$_SESSION['authorization']."</p>";
    4. }else{
    5.     echo "na";
    6. } 
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ну вот вы написали функцию authorization::check_log(), завернули ещё в класс. Очень хорошо. А где вызов-то?

    Добавлено спустя 2 минуты 20 секунд:
    Ну и потом, сейчас гуру прибегут, и расскажут, что хранить открытый пароль нельзя, что в запросе пароль вообще не должен фигурировать. Но я думаю, сначала вообще надо разобраться, как должно работать

    Сессии могут обходиться без кук, тут вы правы. Но тогда надо таскать в урлах Session ID. Одними куками тоже, пожалуй, можно попробовать решить задачу.
     
  3. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    вызов метода не стал выкладывать, но он присутствовал (добавил в первом посте).
    вот вардампнул:
    Код (PHP):
    1. ....
    2.  $result = mysqli_query(database::get_instance(), "SELECT `users_id` from users WHERE `users_login`="."'".self::$login."' and 
    3.             `users_password`="."'".self::$password."'");
    4.         $tmp = mysqli_fetch_assoc($result);
    5.         if ($tmp != NULL){
    6.             var_dump($tmp);die();
    7. ..... 
    итог: array(1) { ["users_id"]=> string(1) "3" } , т.е. условие If'a должно выполниться.

    нужно помаленьку делать, лучше до ума доведу эту проблему, все крутецкие проверки и т.п. прикручу уже потом)
    вот в том и дело, но большинство источников настоятельно рекомендуют использовать и одно, и другое.
    и, вообще, описывается всё так, будто это одно и то же с той лишь разницей, что куки хранит браузер, а сессии - сервер, - в итоге у меня в голове охуев**я каша :(
     
  4. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    HTTP протокол stateless https://en.wikipedia.org/wiki/Stateless_protocol
    Единственный вменяемый способ идентифицировать конкретного человека, его сессию работы с сайтом - это куки.

    $_SESSION - это способ хранения информации на сервере с привязкой к конкретному пользователю. Но конкретного пользователя как-то нужно идентифицировать? Смотрим куки.

    По факту в куках уникальный ID, на основании которого интерпретатор PHP достает из нужного файла на диске (по умолчанию) сохраненную ранее информацию.

    Эту информацию можно было бы класть и напрямую в куку, но кука приходит со стороны пользователя, а значит ей нет доверия. По-этому и используют схему хранения критичной информации на сервере.
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    handler.php вы куда подключаете? В нём session_start() я не вижу
     
  6. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    правильно ли я понял, что делать нужно примерно так:
    1. юзер вводит свои данные в форму
    2. при их правильности создается сессия (session_start() ) и ставится cookie (setcookie() ), в которой будет храниться, например, какая-то строка (например связка "логин-пароль" в мд5, для безопасности)
    3. при каждом новом заходе на сайт необходимо проверять куку?

    Добавлено спустя 1 минуту 44 секунды:
    у меня на самом деле что-то вроде "единой точки входа":
    1. главная index.php, которая в зависимости от ?ction= подключает нужные мне страницы.
    2. в итоге вид такой:
    index.php подключает main.php, который подключает default.php, код которого я в начале и указал. session_start() забыл указать, он там был.

    Добавлено спустя 5 минут 15 секунд:
    в общем говоря, картина такая:
    index.php
    Код (PHP):
    1. <?php
    2. header('Content-Type: text/html; charset=utf8');
    3.  
    4. include "../classes/router.php";
    5. include "../classes/database.php";
    6. $router = new router;
    7.  
    8. $route = 'default';           //default action (including "default.php")
    9. if (isset($_GET['action'])){
    10.     $route = $router->parse_route($_GET['action']);
    11. }
    12. $filePath = "../modules/"."$route".".php";  
    13.  
    14. include '../layouts/main.php';
    15. ?>
    main.php
    Код (PHP):
    1. <?php  if(file_exists($filePath)){
    2. include $filePath;
    3.       }
    4. else{
    5.     die('isn\'t require - error');
    6. } ?>
    default.php
    Код (PHP):
    1. <?php 
    2.  include 'modal-window.php';
    3. if (isset($_SESSION['authorization'])){
    4.     echo "<p>Вы вошли как ".$_SESSION['authorization']."</p>";
    5. }else{
    6.     echo "na";
    7. }
    8. ?>
     
  7. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    попробовал вот так:
    handler.php
    Код (PHP):
    1.  $tmp = mysqli_fetch_assoc($result);
    2.         if ($tmp != NULL){
    3.           session_start();
    4.             //$_SESSION['authorization'] = $tmp[1];
    5.             setcookie(kyka, $tmp[1]);  
    6.           header("location: index.php");
    index incl. main incl. default.php
    Код (PHP):
    1. <?php 
    2.  include 'modal-window.php';
    3.  var_dump($_SESSION);
    4. // var_dump($_COOKIE['kyka'])  === NULL ?wtf
    5.  var_dump($_COOKIE);die();
    рез-ат: array(1) { ["authorization"]=> NULL (??) } array(1) { ["PHPSESSID"]=> string(32) "c713f7eaf681a289d2752c4dd316ec80" } (??)
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    А, ну так вы вот здесь глупость пишите:
    Что такое $tmp[1]? Странно, что вы предупреждение не получили. Вы же сами var_dump приводите:
    В этом массиве нет элемента с индексом 1, есть элемент с индексом "user_id"
     
  9. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    бл*******************************************************************************************************************дь!!!!!!!!! спасибо вам :)

    Добавлено спустя 3 минуты 8 секунд:
    а, может, так было бы правильнее? по сути в так ведь и в сессии будет хранится кука?
    ну, поставиться юзеру в браузер кука, а у меня на сервере в сессии будет хранится такая же кука. или я чушь несу?
    Код (PHP):
    1. if ($tmp != NULL){
    2.           session_start();
    3. setcookie(user_id, $tmp['users_id']);            
    4.           header("location: index.php");   
    5.         }
    6.  
     
  10. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Нет, механизм сессий php все делает сам за вас. Вам только session_start - а поставится или проверися кука прозрачно.
     
  11. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    т.е. просто
    Код (PHP):
    1.  include 'modal-window.php';
    2.  
    3. if (isset($_SESSION['login'])){
    4.     echo "<p>Вы вошли как ".$_SESSION['login']."</p>"; 
    ?
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    iNEEdhLw проверь, зачем спрашивать
     
  13. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    ага, так действительно работает. т.е. так походу и создаётся некая сессионная кука.
    хорошо, т.е. авторизация вполне работает на сессиях)
    эм... а зачем простые куки тогда?

    Добавлено спустя 2 минуты 50 секунд:
    практическая цель какая у них может быть?
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ну к примеру галочка "запомнить меня" делается через куку. В куке можно хранить дату последнего захода и ещё много чего
     
  15. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    товарищи, не вижу в чём проблема.
    делаю процесс разлогинивания. алгоритм, примерно, следующий:
    1. жмём на кнопку "Выход" (которая есть ТОЛЬКО ТОГДА, когда юзер залогинился)
    2. нас перекидывает на handler.php , код которого представлен внизу.


    handler.php :
    Код (PHP):
    1. class authorization{
    2.     static public $login;
    3.     static public $password;
    4.     static public $users_id;
    5.     
    6.     static public function check_log($login, $password){
    7.         self::$login = mysqli_real_escape_string(database::get_instance(),$login);
    8.         self::$password = mysqli_real_escape_string(database::get_instance(),$password);
    9.  
    10.         $result = mysqli_query(database::get_instance(), "SELECT `users_login` from users WHERE `users_login`="."'".self::$login."' and 
    11.             `users_password`="."'".self::$password."'");
    12.         $tmp = mysqli_fetch_assoc($result);
    13.         if ($tmp != NULL){
    14.           session_start();
    15.             $_SESSION['login'] = $tmp['users_login'];        
    16.           header("location: index.php");   
    17.         }else{
    18.             echo "Такой пользователь не зарегистрирован!";
    19.         }
    20.     }
    21. }
    22. if (isset ($_POST['log']) and isset ($_POST['pas'])){
    23.         $connect = database::get_instance();
    24.                     if ($connect){
    25.    authorization::check_log($_POST['log'], $_POST['pas']);
    26.   
    27.                             }
    28.                     }
    29.          } 
    3. чтобы разлогинивание происходило, я добавляю в конце скрипта handler.php
    Код (PHP):
    1.  if ($_SESSION['login'] == TRUE){
    2.             session_unset();
    3.             header("location: index.php");
    4.          }else{
    5.           //   echo "lal";     
    и всё действительно разлогинивает, НО потом я не могу залогиниться, он, видимо, сразу создаёт сессию и ломает её.

    т.е. логика такая: если я попадаю на handler.php с уже существующей переменной сессии login, то нужно ломать сессию. попасть на handler.php с существующей сессией можно только через кнопку "Выйти" (см. скрин)
     
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв