Каков наилучший способ реализации "запомнить меня" для веб-сайта?

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

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

4 ответа

Решение

Усовершенствованная практика использования файлов cookie для постоянного входа в систему

Вы можете использовать эту стратегию, описанную здесь, как наилучшую практику (2006 г.) или обновленную стратегию, описанную здесь (2015 г.):

  1. Когда пользователь успешно входит в систему с установленным флажком Запомнить меня, в дополнение к стандартному файлу управления сеансом выдается файл cookie для входа.
  2. Файл cookie для входа в систему содержит идентификатор серии и токен. Ряд и маркер - это неопровержимые случайные числа из достаточно большого пространства. Оба хранятся вместе в таблице базы данных, токен хэширован (sha256 в порядке).
  3. Когда незарегистрированный пользователь посещает сайт и представляет файл cookie для входа, идентификатор базы данных ищется в базе данных.
    1. Если идентификатор серии присутствует и хэш токена совпадает с хешем для этого идентификатора серии, пользователь считается аутентифицированным. Создается новый токен, новый хеш для токена сохраняется поверх старой записи, и пользователю выдается новый файл cookie для входа (можно повторно использовать идентификатор серии).
    2. Если серия присутствует, но токен не совпадает, предполагается кража. Пользователь получает строго сформулированное предупреждение, и все запоминаемые сеансы пользователя удаляются.
    3. Если имя пользователя и серия отсутствуют, файл cookie для входа игнорируется.

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

Сохраните их UserId и RememberMeToken. Когда они регистрируются с пометкой "Помни меня", генерируют новый RememberMeToken (который делает недействительными любые другие машины, помеченные как "Помни меня").

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

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

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

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

Причина, конечно, в том, что ваши куки, содержащие ваш постоянный сеанс, так легко красть.

4 способа украсть ваши куки (из комментария Дженса Роланда на странице @splattne основываясь на своем ответе):

  1. Перехватывая его по небезопасной линии (перехват пакетов / перехват сеансов)
  2. Прямой доступ к браузеру пользователя (через вредоносное ПО или физический доступ к коробке)
  3. Читая его из базы данных сервера (возможно, SQL-инъекция, но может быть что угодно)
  4. Путем взлома XSS (или подобного эксплойта на стороне клиента)
Другие вопросы по тегам