Делаю форму входа на сайт. Стал вопрос хранения пароля в куках, на случай, если пользователь нажал галочку "Запомнить меня". Всегда хранил хэш пароля прям в куках, и потом сравнивал с хэшем в БД. Сейчас почитал об этом, и многие говорят что так делать нельзя! А как делаете вы?
Я взял за правило не хранить пароли пользователей в открытом виде. PHP: function dataAsStr($data) { return print_r($data, true); } function createHash($data) { return password_hash(dataAsStr($data), PASSWORD_BCRYPT); } function checkHash($data, $hash) { return password_verify(dataAsStr($data), $hash); } Лучше создать пользователю новый пароль, если он его забыл, чем сказать, какой у него пароль. --- Добавлено --- PHP: private function get_cook_id($do_set_cook) { $cook_id = isset($_COOKIE[COOKIE_NAME]) ? decodeStr($_COOKIE[COOKIE_NAME]) : rand(1000000, 9999999); if ($do_set_cook) setcookie(COOKIE_NAME, encodeStr($cook_id), time() + 60 * 60 * 24 * 30, '/', '', true); return $cook_id; }
Суть простая. Генерируешь remember_token (который должен быть сложным, длинным и уникальным), который хранишь в куках и специально отведенном поле в БД. Проверяешь наличие токена и авторизуешь юзера. Токен можно сделать протухающим - т е не вечным. Для этого в БД еще нужно хранить дату его протухания и сравнивать с текущей. --- Добавлено --- Вот тебе функция для генерации токена. Передаешь необходимую длину - получаешь токен. PHP: function generateToken($length = 32) { // Create random token $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $max = strlen($string) - 1; $token = ''; for ($i = 0; $i < $length; $i++) { $token .= $string[mt_rand(0, $max)]; } return $token; }