Лучшая практика для функциональности ‘remember me’?

#php #mysql #session #login

#php #mysql #сессия #аутентификация

Вопрос:

В рамках более крупного проекта, над которым я работаю, мы стремимся интегрировать функцию «запомнить меня» в процесс входа пользователя в систему. Одним из предложений ведущего разработчика было просто сохранить их PHP session_id () в cookie и в их записи в базе данных. Когда они в следующий раз посетят сайт, найдите session_id из файла cookie и получите их учетные данные.

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

Я склонен предложить команде создать отдельную таблицу базы данных, которая имеет следующую структуру:

  ---------------- ---------------- ------------------ -------------------- 
|    user_id     |   session_id   |    ip_address    | initial_login_date |
 ---------------- ---------------- ------------------ -------------------- 
|       5        |  123456789101  |   192.168.0.1    |     1305194639     |
 ---------------- ---------------- ------------------ -------------------- 
|       5        |  021456789101  | 255.255.255.255  |     1305194639     |
 ---------------- ---------------- ------------------ -------------------- 
  

Все, что нам тогда нужно сделать, это посмотреть их session_id в таблице и получить user_id.

Есть ли лучший способ добиться этого?

Комментарии:

1. Из-за таких вещей, как прокси, AOL, черные шляпы и тому подобное, использование ip-адреса для идентификации пользователя — плохая идея. Мне интересно, как выглядит лучшая практика tho.

2. Извините, я должен был выразиться более ясно. Мы не используем IP-адрес для идентификации пользователя — вот почему там есть поле session_id. IP-адрес предназначен для некоторой внутренней системы управления, а не для фактической функциональности входа в систему или идентификации пользователя.

Ответ №1:

Эта статья мне очень помогла

Комментарии:

1. Согласовано — в этой статье описывается поведение, которое вы видите на сайтах высокого класса, в частности, практика антисоциальной инженерии типа «о, вы хотите изменить свои данные пользователя? Повторите, какой у вас был пароль?»

Ответ №2:

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

Ответ №3:

Прежде всего: Вам нужно знать, что наличие такой функции создает намного большее временное окно для злоумышленника, чем обычные сеансы. Поскольку сеансы довольно предназначены для коротких (несколько минут/часов) при таком Запомнить меня функция, как правило, действует в течение длительного срока (нескольких дней, недель или даже месяцев).

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

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

Ответ №4:

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

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

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

Я также поддерживаю сохранение IP-адресов и запрещение постоянных входов в систему, если IP-адреса не совпадают. Лучше не выполнять автоматический вход пользователя, чем сайт будет взломан.

Ответ №5:

Идея о coookies — одна из лучших, которые вы могли бы реализовать AFAIK.

Вторая идея заключается в использовании, например, алгоритма BlowFish. Итак, вы сериализуете массив user и передаете, затем шифруете его с помощью алгоритма BlowFish. Если ваш пользователь зайдет на ваш сайт, вы возьмете у него cookie и расшифруете его с помощью secret от вашего blowfish, отмените сериализацию, затем проверьте имя пользователя и пароль, но это не так безопасно, как метод session_id.