Аутентификация формы - атака воспроизведения cookie - защита
Меня спрашивают об атаках воспроизведения cookie с помощью проверки подлинности с помощью форм ASP.NET.
Я следовал приведенным ниже советам, чтобы защитить себя от любых атак, но думаю, что сайт все еще уязвим, если кому-то удастся получить cookie (хотя и ненадолго). Есть ли способ полностью уничтожить сеанс проверки подлинности форм при выходе из системы, чтобы даже если кто-то украл файл cookie, не было бы возможности использовать его злонамеренно
Совет последовал был
Мы считаем, что мы предприняли все ответственные шаги, которые мы можем защитить от этого в рамках ASP.NET. Пожалуйста, смотрите подробный ответ ниже.
Однако мы выполнили рекомендуемые действия Microsoft для защиты от этого (см. http://support.microsoft.com/default.aspx?scid=kb;en-us;900111).
· Cookie-файл аутентификации никогда не записывается на клиентский компьютер, что затрудняет его кражу.
· Приложение запускается через SSL, поэтому cookie-файлы никогда не передаются по незащищенному соединению.
· Мы применяем абсолютное истечение срока действия с 15-минутным тайм-аутом, означающим, что любые проблемы с cookie-файлами после этого срока бесполезны
· Мы используем файлы cookie httpOnly, чтобы никто не мог программно перехватить или изменить этот файл cookie.
Таким образом, даже если вышеуказанные меры предосторожности были нарушены, что мы считаем крайне маловероятным, у злоумышленника будет только 15-минутное окно, чтобы нарушить меры предосторожности и успешно войти в систему.
3 ответа
Простая идея - сгенерировать случайный гид и сохранить его в разделе пользовательских данных файла cookie. Затем, когда пользователь выходит из системы, вы извлекаете guid из пользовательских данных и записываете его в хранилище на стороне сервера с примечанием о том, что этот "сеанс" завершен.
Затем получите модуль http, который при каждом запросе проверяет, указывает ли указатель из раздела userdata вашего файла cookie на окончание сеанса. Если да, завершите запрос с предупреждением о том, что просроченный cookie используется повторно.
Это идет со стоимостью дополнительного поиска за запрос.
Есть ли способ полностью уничтожить сеанс проверки подлинности форм при выходе из системы, чтобы даже если кто-то украл файл cookie, не было бы возможности использовать его злонамеренно
Способ заключается в том, чтобы отслеживать на вашем сервере, что пользователь вышел из системы и в какое время, поэтому, даже если он увидит страницу, использующую действительный аутентифицированный cookie, вы дважды проверяете, вошел ли этот пользователь в записи вашего сервера или нет.
Это означает, что у вас должна быть дополнительная таблица в вашей базе данных, чтобы хранить и проверять вход в систему статуса ваших пользователей, а не 100-процентный счет в куки-файле аутентификации.
Есть ли способ полностью уничтожить сеанс проверки подлинности формы при выходе
В худшем случае, когда куки украдены, вы на самом деле не можете.
Почему это так, потому что аутентификация формы на самом деле сохраняет в cookie все данные (например, когда истек срок действия, кто пользователь и т. Д.). Таким образом, вы не можете удалить это, находящееся в cookie-файле, и альтернативой является его синхронизация с вашими пользовательскими данными на сервере и дополнительный уровень безопасности.
Связано: Может ли какой-нибудь хакер украсть куки у пользователя и войти под этим именем на веб-сайте?
Вы можете легко аннулировать заявки на авторизацию форм, которые "старше даты X".
FormsAuthenticationTicket
имеет встроенное свойство под названием IssueDate
это позволяет вам сделать это.
Вы можете, например, сделать это:
- сохранить дату в записи базы данных пользователя, вы можете назвать ее
ValidSince
- прочитать маркерную дату внутри
Application_AcquireRequestState
(в global.asax) - если токен
IssueDate
старше даты базы данных - выход!
Если вы хотите сделать недействительным определенного пользователя - просто сбросьте эту дату в базе данных на текущую дату.
Я написал об этом здесь, если вам нужны примеры кода.
Один из наиболее распространенных вариантов использования - "сделать недействительными все сеансы, созданные до последней смены пароля".
Я реализовал систему, которая сохраняет SessionID в куки-файле auth для первого аутентифицированного запроса, а затем проверяет, совпадает ли активный SessionID с куки-файлом в последующих запросах. Подробности на этот ответ. Это позволило избежать отслеживания на стороне сервера, предложенного в ответе @WiktorZychla.
Вероятно, это можно улучшить, сохранив хэш Incoming IP + Request.Browser + SessionID в сеансе и файл cookie авторизации, а не только SessionID.