Каков наилучший способ реализации "запомнить меня" для веб-сайта?
Я хочу, чтобы на моем веб-сайте был установлен флажок, который пользователи могут нажимать, чтобы им не приходилось входить в систему каждый раз, когда они посещают мой веб-сайт. Я знаю, что мне нужно будет сохранить куки на своем компьютере, чтобы реализовать это, но что должно содержаться в этом куки?
Кроме того, существуют ли распространенные ошибки, на которые следует обратить внимание, чтобы этот куки-файл не представлял уязвимость безопасности, которой можно избежать, сохраняя при этом функциональность "помни меня"?
4 ответа
Усовершенствованная практика использования файлов cookie для постоянного входа в систему
Вы можете использовать эту стратегию, описанную здесь, как наилучшую практику (2006 г.) или обновленную стратегию, описанную здесь (2015 г.):
- Когда пользователь успешно входит в систему с установленным флажком Запомнить меня, в дополнение к стандартному файлу управления сеансом выдается файл cookie для входа.
- Файл cookie для входа в систему содержит идентификатор серии и токен. Ряд и маркер - это неопровержимые случайные числа из достаточно большого пространства. Оба хранятся вместе в таблице базы данных, токен хэширован (sha256 в порядке).
- Когда незарегистрированный пользователь посещает сайт и представляет файл cookie для входа, идентификатор базы данных ищется в базе данных.
- Если идентификатор серии присутствует и хэш токена совпадает с хешем для этого идентификатора серии, пользователь считается аутентифицированным. Создается новый токен, новый хеш для токена сохраняется поверх старой записи, и пользователю выдается новый файл cookie для входа (можно повторно использовать идентификатор серии).
- Если серия присутствует, но токен не совпадает, предполагается кража. Пользователь получает строго сформулированное предупреждение, и все запоминаемые сеансы пользователя удаляются.
- Если имя пользователя и серия отсутствуют, файл cookie для входа игнорируется.
Такой подход обеспечивает глубокую защиту. Если кому-то удается утечь таблицу базы данных, это не дает злоумышленнику открытой двери для выдачи себя за пользователей.
Сохраните их UserId и RememberMeToken. Когда они регистрируются с пометкой "Помни меня", генерируют новый RememberMeToken (который делает недействительными любые другие машины, помеченные как "Помни меня").
Когда они вернутся, найдите их по токену Запомнить меня и убедитесь, что идентификатор пользователя совпадает.
Я бы сохранил идентификатор пользователя и токен. Когда пользователь возвращается на сайт, сравните эти две части информации с чем-то постоянным, например с записью в базе данных.
Что касается безопасности, просто не помещайте туда ничего, что позволило бы кому-либо изменить cookie, чтобы получить дополнительные преимущества. Например, не храните их группы пользователей или их пароль. Все, что можно изменить, чтобы обойти вашу безопасность, не должно храниться в cookie.
Исследуя постоянные сеансы самостоятельно, я обнаружил, что это просто не стоит угрозы безопасности. Используйте его, если вам абсолютно необходимо, но вы должны рассматривать такую сессию только как слабо аутентифицированную и принудительно вводить новый логин для всего, что может представлять ценность для злоумышленника.
Причина, конечно, в том, что ваши куки, содержащие ваш постоянный сеанс, так легко красть.
4 способа украсть ваши куки (из комментария Дженса Роланда на странице @splattne
основываясь на своем ответе):
- Перехватывая его по небезопасной линии (перехват пакетов / перехват сеансов)
- Прямой доступ к браузеру пользователя (через вредоносное ПО или физический доступ к коробке)
- Читая его из базы данных сервера (возможно, SQL-инъекция, но может быть что угодно)
- Путем взлома XSS (или подобного эксплойта на стороне клиента)