За последние 24 часа нас посетили 17398 программистов и 1723 робота. Сейчас ищут 1549 программистов ...

Куки сессии.

Тема в разделе "PHP для новичков", создана пользователем Михаил Запаленов, 6 окт 2017.

  1. Михаил Запаленов

    С нами с:
    2 авг 2017
    Сообщения:
    120
    Симпатии:
    1
    Смотрите у меня такой вопрос как лучше делать.

    При заходе на страницу проверять из Кук ун.индетификатор юзера по нему делать запрос и получать привелегии юзера в переменную, а потом проверять.

    Или при заходе привелегии получать из базы если нету в сессии ключа privilege, устанавливать его в сессию и там хранить кто он admin,user и т.д. чтобы на каждой странице не делать запрос в БД.
     
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Михаил Запаленов
    Я бы выбрал сессию, МОУСЗВЕРЬ выбрал бы куки, тебе решать как лучше будет.
     
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну сессия без кук не работает. Но id я бы держал в сессии. Хотя можно и в куках, в принципе, работал с таким движком, главное, пароль туда не кладите. Тут одно но - ID сессии уникальный для каждого устройства, с которого зашёл юзверь, а id узера - одинаковый. Так что менее гибко. Запрос всё равно делать каждый раз - запрос юзера по id очень дешёвый по времезатратам и нагрузке, сервер не рассыпется. Зато если захотите какое-нибудь закрытие сессии сразу всем устройствам сваять, или банить из админки уже войдённого пользователя, как раз пригодится.
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    дроб хеш пользователей отсутствовавших примерно 30 дней
    проверяем на существовании куки - если true
    проверяем значение куки с значением хеша с БД
    проверяем существовании сессии - если true
    пользуемся данными из сессии id, username и что там по желанию​
    если false
    восстанавливаем сессию заполняя ее id, username и что там по желанию вытащив из бд​
    если false
    удаляем куки​
    если false
    блин я забыл :(:(:(:(:(:(
    там походу с проверкой сущ сессии с ID опять идет + добавляем куки
    нее...
    бляяя:oops:
    --- Добавлено ---
    имбовую аутентификацию забыть логику, позор
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @MouseZver
    а блин я не прав, зверь за то чтобы использовалась и сессия и куки, ты вообще реальный зверь в php.
     
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Зачем держать хеш ? Хотя точно это у меня нету куков. А в куках скорее да нужно хранить уникальный хеш который если есть сверять с бд и восстонавливать по нему id сессии
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    нет
    --- Добавлено ---
    есть куки, есть сессия с флагом logged / нету хеша в бд ( мб очистился долго не заходил, или смена логина и т.д. )
    восстановить хеш бд
    Аутентификация​

    есть куки, есть хеш в бд / нету сессии ( закрыл браузер )
    Аутентификация​

    есть хеш в бд, есть сессия / нету кук ( браузер оффнул по сроку )
    восстановить куки
    Аутентификация​
     
    Dimon2x нравится это.
  8. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Боюсь даже спросить, очистился он по крону ?:confused:
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    кроном никогда не пользовался
     
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @MouseZver лиж бы повыпендриваться а вот ниже не заметил что я дописал ?
    --- Добавлено ---
    бессмыслица использовать один и тот же хеш всегда. Его нужно генерировать уникальный каждый раз когда отдаёшь его в куку. И хранить пока время не истечёт повысит уровень защиты.
    --- Добавлено ---
    хотя при заходе с другово устр-ва будет выбивать. Предыдущее.
    --- Добавлено ---
    Но тут конечно можно что-нибудь придумать. Но эт ладно. Например держать массив хешей под разные устройства в json
     
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    дроб хеш пользователей отсутствовавших примерно 30 дней
    isCookie = проверяем куки true / false (1)
    isCookie = true
    isHash = проверяем значение куки с значением хеша с БД true / false​

    isLogged = {
    проверяем существовании сессии logged true {
    isHash = true
    вытаскиваем из сессии данные. username ...

    return TRUE;​
    ИНАЧЕ {
    проверяем существовании сессии logged true (2)
    запрос с бд id, username, password

    isHash = false {
    $hash = md5 ( $account -> id . $account -> username . $account -> password );

    обновление онлайна / хеша по ID пользователя

    setcookie ( на 30 дней например );​
    }
    ИНАЧЕ isHash = true
    запрос с бд id, username​
    ИНАЧЕ
    delCookie
    return false;
    isHash = true
    обновление онлайна по ID пользователя​
    запись в сессию
    id
    logged = true
    username
    return true;​
    }
    }

    isHash = true {
    проверяем существовании сессии logged true (2)
    запрос с бд id, username, password

    isHash = false {
    $hash = md5 ( $account -> id . $account -> username . $account -> password );

    обновление онлайна / хеша по ID пользователя

    setcookie ( на 30 дней например );​
    }
    ИНАЧЕ isHash = true
    запрос с бд id, username​
    ИНАЧЕ
    delCookie
    return false;
    isHash = true
    обновление онлайна по ID пользователя​

    запись в сессию
    id
    logged = true
    username
    return true;​
    }

    isCookie = true
    delCookie​
    return FALSE;​
    }


    Я eval эту логику составлять
    --- Добавлено ---
    я такой :rolleyes: не умею же аргументировать
    --- Добавлено ---
    об этом думал и забил, в целях быстродействия -> меньше запросов аутентификации гуд
    --- Добавлено ---
    PHP:
    1. protected function isCookie(): bool
    2.     {
    3.         return (bool) filter_input ( INPUT_COOKIE, $this -> cookie, FILTER_VALIDATE_REGEXP, [ 'options' => [ 'regexp' => '/^[a-f0-9]{32}$/' ] ] );
    4.     }
    без комментариев. Проверка нужна чтобы в дальнейшем заюзать обычный запрос к бд без подготовленных. Строго и просто. Нет = пошел нафуй куки = false
    мм точно, помимо... бляя:confused:
    в первом ветвлении шло два раза проверки sess logged
    во втором только один

    хотя и нахрен мне дополнительный метод с флагом прописывать чтобы проверить несчастную переменную, пусть остается isset ( $_SESSION['logged'] )
    --- Добавлено ---
    https://github.com/MouseZver/My-garbage-code/tree/master/php.ru/64708/66365
    --- Добавлено ---
    хотя стоп, это обычно относится к хешу паролю, а хеш аутентификации составляется стандартом из id name password = можно через password_verify /hash создать токен, вобщем надо думать, а думать лень перед выходными :)
    --- Добавлено ---
    а толк если verify скажет true при разных полярностей времени, ой впизду
     
    #11 MouseZver, 6 окт 2017
    Последнее редактирование: 6 окт 2017
  12. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    PHP:
    1. // примерный код
    2. error_reporting(-1);
    3. session_start();
    4. function message($key, $value)
    5. {
    6.     $_SESSION[$key] = $value;
    7.     session_regenerate_id();
    8.     header('location: ' . $_SERVER['REQUEST_URI']);
    9.     exit();
    10. }
    11. if (filter_has_var(INPUT_POST, 'do')) {
    12.     if ($_POST['do'] != session_id()) {
    13.         message('red', 'Идентификатор не соответствует');
    14.     }
    15.     # код обработчика
    16.     message('green', 'Идентификатор соответствует');
    17. }
    18. if ($_SESSION) {
    19.     foreach ($_SESSION as $key => $value) {
    20.         echo '<div style="color: ' . $key . ';">' . $value . '</div>';
    21.     }
    22. }
    23. ?>
    24. <form method="post">
    25.     <button name="do" value="<?= session_id() ?>">
    26.         Отправить
    27.     </button>
    28. </form>
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Это типа CSRF-защита? Обычно всё-таки другое значение делают, не session_id(). И он меняется в течение одной сессии после разных отправок форм часто
     
    PhpStorm нравится это.
  14. PhpStorm

    PhpStorm Новичок

    С нами с:
    21 сен 2017
    Сообщения:
    65
    Симпатии:
    11
    Адрес:
    JetBrains
    ну я там и пометил, что код примерный, для простого понятия, что и как :)
     
    Михаил Запаленов нравится это.
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Да.
    --- Добавлено ---
    Ппц у вас тут баталии, хотя автору нужно было просто узнать, первый вариант или второй предпочтительней. При том, что он явно понимает, что делает, либо собирается делать, но ищет совет со стороны для выбора направления.
    --- Добавлено ---
    По части первого варианта - он банально сложнее в сопровождении и использовании.
    Да и незачем user_id хранить в куке. А если я другой поставлю? Тут гляди, какая логика - все данные, которые не нужны клиенту, которые не влияют на его работу, которые не участвуют в его логике, не должны храниться на клиенте.

    Все, что приходит от клиента - априори хакерская атака. Мысли именно такими категориями. Вытаскивая на клиент лишние серверные данные ты добавляешь векторы атак, только и всего. И усложняешь логику приложения на ровном месте. Сессии были придуманы не просто так. Use it!
     
    Михаил Запаленов нравится это.