Как я должен реализовать неявные выходы из системы? - PullRequest
2 голосов
/ 18 августа 2011

Моя система входа в систему в настоящее время работает следующим образом:

  1. Получите имя пользователя и пароль из формы POST.
  2. Проверьте имя пользователя и соленый + хешированный пароль для базы данных.
  3. Если аутентификация прошла успешно, сгенерируйте длинную случайную буквенно-цифровую строку.
  4. Сохраните эту строку в MySQL, а также в переменной $_SESSION вместе с именем пользователя.
    • Это не просто ввод пароля пользователя в $_SESSION. Я чувствую, что это оставляет дверь широко открытой для проникновения шпионского ПО и кражи учетных данных пользователя.
  5. На каждой странице, требующей аутентификации (например, настройки нечувствительных учетных записей, области только для членов и т. Д.), Проверьте $_SESSION имя пользователя и строку с теми, которые хранятся в MySQL.
  6. Если они совпадают, продолжайте и покажите страницу. В противном случае покажите форму входа. (?)
  7. Когда пользователь явно выходит из системы, удалите случайные строки из MySQL и $_SESSION.

Я застрял в том, как справиться, когда пользователь неявно выходит из системы. То есть, когда он / она закрывает окно браузера, не нажимая кнопку «Выйти» на сайте. Я уверен, что мне все еще нужно удалить случайную строку из MySQL, чтобы кто-то не мог использовать украденный файл cookie для входа в систему. Но как узнать, когда пользователь закрывает окно браузера?

(функциональность "Запомнить меня" на данный момент не имеет значения.)

Ответы [ 2 ]

3 голосов
/ 18 августа 2011

Как мне реализовать сеансы входа в систему?

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

Если аутентификация прошла успешно, сгенерируйте длинную случайную буквенно-цифровую строку.

Почему? PHP уже генерирует случайный идентификатор (идентификатор сеанса). Если вы хотите провести различие между аутентифицированными / неаутентифицированными пользователями и / или определить, кому принадлежит текущий сеанс, просто сохраните имя пользователя / идентификатор пользователя в сеансе.

ввод пароля пользователя в переменную $ _SESSION

Зачем вам это нужно - после аутентификации пользователя вам больше не нужно использовать пароль.

сверяет имя пользователя и строку $ _SESSION с теми, которые хранятся в MySQL

Почему? Как изменить данные сеанса иначе , чем через ваш код? Если вы подозреваете, что ваш серверный код может быть подделан, то не имеет значения, что вы делаете, система будет небезопасна.

Когда пользователь явно выходит из системы

... вы явно уничтожаете сеанс. Вот и все.

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

Кстати: существует ряд проблем безопасности, которые вы не рассмотрели в своем предложении, в частности, восстановление идентификатора сеанса после попытки аутентификации.

0 голосов
/ 18 августа 2011

Вы можете использовать вызов ajax для события onclose, чтобы завершить сеанс ... никогда не пробовал, но это должно работать:

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