Система входа в систему на PHP, использующая файлы cookie и Соленые хэши

StackOverflow https://stackoverflow.com/questions/401985

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

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

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

Заранее благодарю вас

Редактировать:Ответы Эрана и Брайана в совокупности, кажется, это то, что мне нужно.К сожалению, я могу отметить только один из них как принятый.Я постараюсь пойти дальше и реализовать, чтобы увидеть, какой из них был более полезным.

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top