Как безопасно хранить файлы cookie, содержащие конфиденциальные данные, в PHP?

Я бы хотел, чтобы мои пользователи имели возможность «Держать меня вошедшим в систему» ​​при входе на мой сайт. По предложению главного ответа на этот пост «Keep Me Logged In» – лучший подход , я решил использовать комбинацию соли и пароля пользователя в одном cookie и хранить идентификатор пользователя (число) в другом файле cookie. Разумеется, значение хэша также будет храниться на стороне сервера базы данных для проверки, когда пользователь снова вернется. Значение соли, которое я использовал, является тем же, что я использовал для хеширования пароля пользователя, когда он впервые регистрируется, поэтому он статичен – он не изменяется между сеансами. С этим подходом я вижу несколько проблем.

1) Использует ли соль регистрации хорошую идею, если она статична, или я должен каждый раз генерировать различную соль для печенья?

2) Если кто-то должен получить доступ к файлам cookie, и они скопируют их на другой компьютер, а затем попытаться получить доступ к веб-сайту с этого компьютера, теоретически, он автоматически зарегистрирует их в учетной записи этого пользователя, разве это не проблема безопасности?

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

Поэтому мой вопрос: как я могу хранить cookie на PHP с конфиденциальной информацией, такой как хэш пароля пользователя, не беспокоясь о вышеупомянутых проблемах? Конечно, такие сайты, как Gmail и Hotmail, которые предлагают эту функцию «Keep me logged in», следуют более безопасному подходу, чем то, что я сейчас делаю, так как они это сделают?

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

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

Да. Это недостаток этой функции. Однако, если ваш сайт обнаруживает новый IP-адрес (особенно из разных стран) и требует второго шага (текст кода на мобильное устройство и т. Д.), Тогда вы позаботитесь об этой проблеме вместе с общей проблемой похищенного пароля. (Это, конечно, не помогает предотвратить атаки локальной сети, например, небезопасный публичный Wi-Fi).

Более удобным решением является требование, чтобы cookie «помнить меня» использовало SSL. Таким образом, хакер никогда не увидит файл cookie в простой передаче текста, и, вероятно, потребуется локальная атака. (И если такие, помните, что cookie – это, пожалуй, наименьшая из проблем пользователя.)

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

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

Кроме того, вы можете считать, что логин «запомнить меня» является половиной входа. Доступ к покупке что-либо, изменение адреса электронной почты и т. Д. Все равно потребует ввода пароля. Сделать безвредные вещи, такие как публикация на доске объявлений, можно без пароля.

Наконец, обратите внимание, что cookie-сессия PHP-сессии – не что иное, как временный токен «запомнить меня»! В значительной степени это относится к концепции захвата сеанса. Значок «запомнить меня» просто добавляет больше возможностей.

Короче говоря: не храните ничего в cookie, требуйте SSL для cookie, и, если возможно, выполните многофакторную аутентификацию … особенно для учетных записей администратора.