Ваш подход очень хорош для обычных сессий.Проблемным моментом здесь является функция «помни меня», которая должна обрабатываться не так, как обычный сеанс.
Обычный способ реализации этой функции - сохранить второй файл cookie с большой датой истечения срока действия и поместитьидентификатор пользователя плюс безопасный хеш в нем.Вам нужен идентификатор пользователя или какой-либо другой идентификатор, чтобы определить, какой пользователь возвращается, но вам также нужен безопасный хеш, чтобы быть уверенным, что файл cookie - это файл, установленный вашим веб-приложением, и который не был создан вручную.Если у вас нет безопасного хэша, люди могут отправить самостоятельно созданный файл cookie с идентификатором пользователя и автоматически войти в систему.
Поэтому безопасный хэш должен содержать информацию, о которой знает только ваше веб-приложение, т.е.дата создания пользователя.
Возможно, вы захотите сделать это следующим образом:
$cookieValue = (int)$user->id . ':' . md5($user->creationDate . '/' . $user->passwordHash);
Поскольку ни creationDate
, ни passwordHash
не изменяются, вы можете проверить действительность безопасного хэша, когдапользователь пытается войти через cookie.Когда пользователь изменяет свой пароль, хэш пароля изменяется, и ему нужен новый файл cookie - что, на мой взгляд, очень хорошо, поскольку люди, которые украли этот файл cookie, также будут отключены.
Если вы хотите дополнительная безопасность , используйте другое значение для создания хеша, то есть специальный хеш cookie, который вы храните вместе с другими пользовательскими данными.Вы можете создать его совершенно случайно и изменять его всякий раз, когда пользователь входит в систему:
$randomValue = md5(time() . rand() . $user->passwordHash);
$user->setCookieValue($randomValue);
$cookieValue = (int)$user->id . ':' . $randomValue;
Теперь при входе в систему:
list($userId, $hash) = explode(':', $cookieValue);
$user = loadUser($userId);
if ($user instanceof User && $user->cookieValue == $hash) {
//user logged in
//generate and set new cookie value
} else {
// handle invalid persistent cookie
}