Система входа в PHP с использованием Cookies и соленых хешей
Я разрабатываю систему входа на основе PHP.
Каждый пользователь имеет идентификатор (номер) и пароль, который хранится как соленый хеш.
Я могу выяснить, является ли логин успешным или нет, но теперь мне нужно хранить эту информацию где-нибудь (так что пользователь не будет окончательно выходить из системы).
В прошлом я играл с переменными $_SESSION. Однако они, кажется, удаляются, когда пользователь покидает браузер, что нежелательно.
Кроме того, я не могу "предположить", что пользователь не попытается обмануть систему, поэтому она должна быть безопасной.
Итак, вот мои вопросы:
- Должен ли я использовать
$_SESSION
или $_COOKIE
? Каковы основные преимущества каждого из этих подходов?
- Как установить флажок "Запомнить меня"?
- Какая информация должна храниться в переменной session/cookie?
Обратите внимание, что в этом конкретном вопросе не рассматриваются проблемы безопасности базы данных.
Что касается номера 3, я имею в виду:
- Должен ли я хранить идентификатор и хешированный пароль пользователя в файле cookie/сеансе или
- Должен ли я хранить идентификатор и недопустимый пароль пользователя в файле cookie/сеансе или
- Должен ли я хранить "SessionID" и пароль (хэшированные или не хешированные?) или
- Должен ли я хранить "SessionID", "ID" и пароль (еще раз, хэшированные или не хэшированные)?
Я хочу, чтобы мой сайт был максимально безопасным, но эффективным и удобным для пользователя.
Если используется подход на основе SessionID, я также хотел бы получить некоторое объяснение относительно его хранения в базе данных.
Заранее благодарю
РЕДАКТИРОВАТЬ: ответы Эрана и Брайана, как представляется, являются тем, что мне нужно. К сожалению, я могу отметить только один из них, как принято. Я попытаюсь выполнить и реализовать, чтобы узнать, какой из них более полезен.
Ответы
Ответ 1
Я хочу повторить точку Eran никогда, чтобы сохранить пароль пользователя или даже хэш пароля в сеансе или данных cookie.
В общем, я реализовал функцию запоминания в веб-приложениях с помощью Cookies. Хорошим местом для начала создания "надежной" постоянной системы входа является сообщение в блоге на аквариуме. Подробный ответ уже рассмотрен в другом ответе на переполнение стека.
Если вам нужно обеспечить безопасность входа, вы должны использовать https. Это связано с тем, что файлы cookie или сеансы могут быть украдены, если они не зашифрованы.
Еще одна хорошая практика - 2-уровневая система входа в систему. Вы можете увидеть это на сайтах, таких как Amazon, где вы можете добавлять вещи в свою корзину без входа в систему, но если вы хотите проверить или изменить свою учетную запись, вам нужно снова ввести свой пароль.
Ответ 2
Для получения конфиденциальной информации (т.е. результатов проверки подлинности) используются только сеансы. Сеансы хранятся на стороне сервера и гораздо менее подвержены риску.
Что касается времени жизни сеанса, то по умолчанию это время жизни сеанса браузера, но вы можете это контролировать. Есть несколько настроек, которые влияют на это:
session.gc_maxlifetime - эффективно контролирует время жизни сеанса.
session.gc_probability и session.gc_divisor вместе определяют, как часто будет выполняться сборка мусора сеанса.
И last - session.cookie_lifetime контролирует время жизни файла cookie сеанса (куки файл, в котором хранится идентификатор сеанса, поэтому он не должен транслироваться по URL-адресу). Он должен соответствовать значению session.gc_maxlifetime.
Кроме того, никогда не храните пароли в сеансах или куки (даже в хэшированном формате). Просто результаты проверки подлинности.
Ответ 3
Сохраните идентификатор в $_SESSION, но не храните хешированный или не хешированный пароль. После входа пользователя в систему, и идентификатор сохраняется в $_SESSION, вам больше не нужен пароль.