Система входа в PHP с использованием файлов cookie и соленых хэшей - PullRequest
18 голосов
/ 31 декабря 2008

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

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

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 31 декабря 2008

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

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

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

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

8 голосов
/ 31 декабря 2008

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

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

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

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

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

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

0 голосов
/ 31 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...