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

SpikePHP

Делаю форму входа на сайт. Стал вопрос хранения пароля в куках, на случай, если пользователь нажал галочку «Запомнить меня».

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

А как делаете вы?

 

miketomlin

acso

Я взял за правило не хранить пароли пользователей в открытом виде.

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, «https://php.ru/», », true);
  4.         return $cook_id;
  5.     }
 

TeslaFeo

Суть простая.
Генерируешь 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

Спасибо за ответы! Разобрался в вопросе

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *