«Keep Me Logged In» - лучший подход - PullRequest
239 голосов
/ 31 августа 2009

Мое веб-приложение использует сеансы для хранения информации о пользователе после того, как он вошел в систему, и для сохранения этой информации при перемещении со страницы на страницу в приложении. В этом конкретном приложении я храню user_id, first_name и last_name человека.

Я хотел бы предложить опцию «Keep Me Logged In» при входе в систему, в которой на компьютер пользователя будут помещены файлы cookie на две недели, которые будут перезапускать сеанс с теми же данными, когда они возвращаются в приложение.

Каков наилучший подход для этого? Я не хочу хранить их user_id в cookie-файлах, так как кажется, что одному пользователю будет легко попытаться подделать личность другого пользователя.

Ответы [ 12 ]

2 голосов
/ 04 августа 2013

Мое решение таково. Это не на 100% пуленепробиваемый, но я думаю, что это спасет вас в большинстве случаев.

Когда пользователь успешно вошел в систему, создайте строку с этой информацией:

$data = (SALT + ":" + hash(User Agent) + ":" + username 
                     + ":" + LoginTimestamp + ":"+ SALT)

Шифрование $data, установите тип HttpOnly и установите cookie.

Когда пользователь вернется на ваш сайт, выполните следующие действия:

  1. Получить данные cookie. Удалить опасные символы внутри cookie. Взрывай его с : символом.
  2. Проверить правильность. Если cookie старше X дней, перенаправьте пользователя на страницу входа.
  3. Если cookie не старый; Получить последнее время смены пароля из базы данных. Если пароль изменился после последнего входа пользователя, перенаправьте пользователя на страницу входа.
  4. Если пропуск не был изменен недавно; Получить текущий браузер агента пользователя. Проверьте, является ли (currentUserAgentHash == cookieUserAgentHash). Если агенты такие же, перейдите к следующему шагу, иначе перенаправьте на страницу входа.
  5. Если все шаги пройдены успешно, авторизовать имя пользователя.

Если пользователь выходит из системы, удалите этот файл cookie. Создайте новый файл cookie, если пользователь повторно войдет в систему.

0 голосов
/ 31 августа 2009

Реализация функции «Keep Me Logged In» означает, что вам необходимо точно определить, что это будет означать для пользователя. В простейшем случае я бы использовал это, чтобы означать, что время сеанса намного больше: 2 дня (скажем) вместо 2 часов. Для этого вам понадобится ваше собственное хранилище сеансов, возможно, в базе данных, поэтому вы можете установить время истечения срока действия для данных сеанса. Затем вам нужно убедиться, что вы установили cookie-файл, который будет храниться в течение нескольких дней (или дольше), а не истекает при закрытии браузера.

Я слышу, как вы спрашиваете: «Почему 2 дня? Почему не 2 недели?». Это потому, что использование сессии в PHP автоматически отодвигает срок действия обратно. Это связано с тем, что истечение срока сеанса в PHP на самом деле является временем простоя.

Теперь, сказав это, я, вероятно, реализовал бы более жесткое значение тайм-аута, которое я храню в самом сеансе и через 2 недели или около того, и добавил бы код, чтобы увидеть это и принудительно аннулировать сеанс. Или, по крайней мере, выйти из них. Это будет означать, что пользователю будет предложено периодически входить в систему. Yahoo! делает это.

...