Как улучшить мою схему входа пользователя - PullRequest
3 голосов
/ 14 июня 2011

Вопрос простой и базовый. Я работал с PHP-сессиями в течение многих лет, и я всегда управлял входом / выходом из системы таким образом:

  1. Начало сеанса (session_start() вызов).
  2. Логин: сохранить значение в сеансе (т. Е. $_SESSION["user_id"] = 34).
  3. Проверьте, зарегистрирован ли пользователь: Проверьте значение сеанса (т.е. isset($_SESSION["user_id"])).
  4. Выход из системы: уничтожить сеанс (session_destroy() вызов и unset($_SESSION["user_id"])).

Эта схема работала для меня с очень простыми приложениями, но сейчас я работаю в более крупном приложении, и этот подход немного проблематичен. Например, я не могу установить флажок «запомнить» в поле входа в систему, потому что я могу установить большую дату истечения срока действия cookie сеанса, но сеанс заканчивается раньше ($_SESSION["user_id"] не установлен).

Вопрос в том, как можно улучшить эту схему или которая является стандартной схемой для управления пользовательскими сеансами в PHP?

Ответы [ 2 ]

4 голосов
/ 14 июня 2011

Ваш подход очень хорош для обычных сессий.Проблемным моментом здесь является функция «помни меня», которая должна обрабатываться не так, как обычный сеанс.

Обычный способ реализации этой функции - сохранить второй файл 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
}
0 голосов
/ 14 июня 2011

Легко, просто измените свой код следующим образом:

  1. Посмотрите, содержит ли $ _SESSION ["user_id"] значение
  2. Если нет, посмотрите, содержит ли cookie реальныйпользовательские данные, если это так, сохраняются в сеансе и входят в систему
...