Система входа в PHP с использованием Cookies и соленых хешей

Я разрабатываю систему входа на основе PHP. У каждого пользователя есть ID (число) и пароль, который хранится как соленый хеш.

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

Раньше я играл с переменными $ _SESSION. Однако они, кажется, удаляются, когда пользователь покидает браузер, что нежелательно. Кроме того, я не могу «предположить», что пользователь не будет пытаться обмануть систему, поэтому он должен быть безопасным.

Итак, вот мои вопросы:

  1. Должен ли я использовать $_SESSION или $_COOKIE ? Каковы основные преимущества каждого из этих подходов?
  2. Как установить флажок «Запомнить меня»?
  3. Какая информация должна храниться в переменной session / cookie?

Обратите внимание, что в этом конкретном вопросе не рассматриваются проблемы безопасности базы данных.

Что касается номера 3, я имею в виду:

  • Должен ли я хранить идентификатор и хешированный пароль пользователя в файле cookie / сеансе или
  • Должен ли я хранить идентификатор и недопустимый пароль пользователя в файле cookie / сеансе или
  • Должен ли я хранить «SessionID» и пароль (хэшированные или не хешированные?) Или
  • Должен ли я хранить «SessionID», «ID» и пароль (еще раз, хэшированные или не хэшированные)?

Я хочу, чтобы мой сайт был безопасным, но эффективным и удобным для пользователей, насколько это возможно. Если используется подход на основе SessionID, я также хотел бы получить некоторое объяснение относительно его хранения в базе данных.

заранее спасибо

РЕДАКТИРОВАТЬ: ответы Эрана и Брайана, похоже, все, что мне нужно. К сожалению, я могу отметить только один из них, как принято. Я попытаюсь выполнить и реализовать, чтобы узнать, какая из них более полезна.

Solutions Collecting From Web of "Система входа в PHP с использованием Cookies и соленых хешей"

Я хочу повторить, что точка Эрана никогда не хранит пароль пользователя или даже хэш пароля в сеансе или данные cookie.

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

Если вам нужно обеспечить безопасность входа, вы должны использовать https. Это связано с тем, что файлы cookie или сеансы могут быть украдены, если они не зашифрованы.

Еще одна хорошая практика – 2-уровневая система входа в систему. Вы можете увидеть это на таких сайтах, как Amazon, где вы можете добавлять вещи в свою корзину без входа в систему, но если вы хотите проверить или изменить свою учетную запись, вам нужно снова ввести свой пароль.

Для конфиденциальной информации (то есть, результатов аутентификации) используются только сеансы. Сеансы хранятся на стороне сервера и гораздо менее подвержены риску.

Что касается времени жизни сеанса, по умолчанию это время жизни сеанса браузера, но вы можете это контролировать. Есть несколько настроек, которые влияют на это:

session.gc_maxlifetime – эффективно контролирует время жизни сеанса.

session.gc_probability и session.gc_divisor вместе определяют, как часто будет выполняться сборка мусора сеанса.

И last – session.cookie_lifetime контролирует время жизни файла cookie сеанса (cookie, в котором хранится идентификатор сеанса, поэтому он не должен транслироваться по URL-адресу). Он должен соответствовать значению session.gc_maxlifetime.

Кроме того, никогда не храните пароли в сеансах или куки (даже в хэшированном формате). Просто результаты проверки подлинности.

Сохраните идентификатор в $ _SESSION, но не храните хэшированный или не хешированный пароль. После входа пользователя в систему, и идентификатор сохраняется в $ _SESSION, вам больше не нужен пароль.