Аутентификация формы - атака воспроизведения 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 это позволяет вам сделать это.

Вы можете, например, сделать это:

  1. сохранить дату в записи базы данных пользователя, вы можете назвать ее ValidSince
  2. прочитать маркерную дату внутри Application_AcquireRequestState (в global.asax)
  3. если токен IssueDate старше даты базы данных - выход!

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

Я написал об этом здесь, если вам нужны примеры кода.

Один из наиболее распространенных вариантов использования - "сделать недействительными все сеансы, созданные до последней смены пароля".

Я реализовал систему, которая сохраняет SessionID в куки-файле auth для первого аутентифицированного запроса, а затем проверяет, совпадает ли активный SessionID с куки-файлом в последующих запросах. Подробности на этот ответ. Это позволило избежать отслеживания на стороне сервера, предложенного в ответе @WiktorZychla.

Вероятно, это можно улучшить, сохранив хэш Incoming IP + Request.Browser + SessionID в сеансе и файл cookie авторизации, а не только SessionID.

Другие вопросы по тегам