За последние 24 часа нас посетили 48050 программистов и 16804 робота. Сейчас ищут 1682 программиста ...

Безопасность. Как правильно сделать "Remember me" ?

Тема в разделе "PHP для новичков", создана пользователем SpikePHP, 1 мар 2021.

  1. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Делаю форму входа на сайт. Стал вопрос хранения пароля в куках, на случай, если пользователь нажал галочку "Запомнить меня".

    Всегда хранил хэш пароля прям в куках, и потом сравнивал с хэшем в БД.
    Сейчас почитал об этом, и многие говорят что так делать нельзя!

    А как делаете вы?
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.862
    Симпатии:
    657
  3. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Я взял за правило не хранить пароли пользователей в открытом виде.
    PHP:
    1. function dataAsStr($data) {
    2.     return print_r($data, true);
    3. }
    4.  
    5. function createHash($data) {
    6.     return password_hash(dataAsStr($data), PASSWORD_BCRYPT);
    7. }
    8.  
    9. function checkHash($data, $hash) {
    10.     return password_verify(dataAsStr($data), $hash);
    11. }
    Лучше создать пользователю новый пароль, если он его забыл, чем сказать, какой у него пароль.
    --- Добавлено ---
    PHP:
    1. private function get_cook_id($do_set_cook) {
    2.         $cook_id = isset($_COOKIE[COOKIE_NAME]) ? decodeStr($_COOKIE[COOKIE_NAME]) : rand(1000000, 9999999);
    3.         if ($do_set_cook) setcookie(COOKIE_NAME, encodeStr($cook_id), time() + 60 * 60 * 24 * 30, '/', '', true);
    4.         return $cook_id;
    5.     }
     
  4. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.971
    Симпатии:
    753
    Суть простая.
    Генерируешь remember_token (который должен быть сложным, длинным и уникальным), который хранишь в куках и специально отведенном поле в БД. Проверяешь наличие токена и авторизуешь юзера.
    Токен можно сделать протухающим - т е не вечным.
    Для этого в БД еще нужно хранить дату его протухания и сравнивать с текущей.
    --- Добавлено ---
    Вот тебе функция для генерации токена. Передаешь необходимую длину - получаешь токен.
    PHP:
    1. function generateToken($length = 32) {
    2.     // Create random token
    3.     $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    4.    
    5.     $max = strlen($string) - 1;
    6.    
    7.     $token = '';
    8.    
    9.     for ($i = 0; $i < $length; $i++) {
    10.         $token .= $string[mt_rand(0, $max)];
    11.     }  
    12.    
    13.     return $token;
    14. }
     
    SpikePHP нравится это.
  5. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Спасибо за ответы! Разобрался в вопросе