Я разрабатываю систему входа на основе PHP. У каждого пользователя есть ID (число) и пароль, который хранится как соленый хеш.
Я могу выяснить, является ли логин успешным или нет, но теперь мне нужно хранить эту информацию где-нибудь (чтобы пользователь не был окончательно выведен из системы).
Раньше я играл с переменными $ _SESSION. Однако они, кажется, удаляются, когда пользователь покидает браузер, что нежелательно. Кроме того, я не могу «предположить», что пользователь не будет пытаться обмануть систему, поэтому он должен быть безопасным.
Итак, вот мои вопросы:
$_SESSION
или $_COOKIE
? Каковы основные преимущества каждого из этих подходов? Обратите внимание, что в этом конкретном вопросе не рассматриваются проблемы безопасности базы данных.
Что касается номера 3, я имею в виду:
Я хочу, чтобы мой сайт был безопасным, но эффективным и удобным для пользователей, насколько это возможно. Если используется подход на основе SessionID, я также хотел бы получить некоторое объяснение относительно его хранения в базе данных.
заранее спасибо
РЕДАКТИРОВАТЬ: ответы Эрана и Брайана, похоже, все, что мне нужно. К сожалению, я могу отметить только один из них, как принято. Я попытаюсь выполнить и реализовать, чтобы узнать, какая из них более полезна.
Я хочу повторить, что точка Эрана никогда не хранит пароль пользователя или даже хэш пароля в сеансе или данные 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, вам больше не нужен пароль.