Альтернативным способом сделать это может быть использование куки в качестве зашифрованного хранилища только для косвенных данных. Вам понадобится какой-нибудь незашифрованный идентификатор, который будет служить указателем на ключ (или информация, необходимая для получения ключа) в базе данных приложения, а затем большой двоичный объект, зашифрованный ключом, полученным из идентификатора, который сам будет содержать какой-то одноразовый идентификатор, который аутентифицирует сеанс.
Учитывая следующие предположения:
- Ваша база данных защищена (например, ваше приложение может получить к ней доступ, но ваш пользователь не может сделать это напрямую, а также при условии, что приложение защищено от внедрения SQL)
- Ваши соли сильны; то есть, достаточно высокой энтропии, что попытка взломать соленый пароль невозможна, даже если пароль известен
Тогда это обеспечит метод, с помощью которого можно быть достаточно уверенным, что сессия не может быть похищена или украдена каким-либо образом. То есть скопированный cookie имеет ограниченную полезность, поскольку пользователь не должен был использовать cookie между его кражей и использованием злоумышленником.
Хотя это защищает от повторного воспроизведения, это также означает, что если кому-то удастся украсть файл cookie точно в нужное время и удастся также использовать его до того, как это сделает исходный, законный пользователь, злоумышленник теперь контролирует сеанс. , Можно ограничить сеанс IP-адресом, чтобы снизить этот риск (в некоторой степени; если и пользователь, и злоумышленник находятся за одним и тем же NAT, что является наиболее вероятным сценарием в любой домашней сети или сети малого и среднего бизнеса), тогда эта точка это довольно спорный вопрос, поскольку IP-адрес в любом случае выглядит одинаковым. Также полезным может быть ограничение текущего пользовательского агента (хотя он может неожиданно прерваться, если пользователь обновит свой браузер, а время закрытия сеанса не истечет), или найти какой-либо метод, с помощью которого можно идентифицировать компьютер, на котором работает пользователь. достаточно хорошо, что есть разумная уверенность в том, что пользователь не переместил cookie из одной системы в другую. Если не использовать какой-нибудь бинарный плагин (Flash или Silver / Moonlight), я не уверен, что последний возможен.
Для защиты от постоянного перехвата сеанса требуется, чтобы пользователь периодически повторял свою аутентификацию (например, ограничивал допустимый срок жизни сеанса или требовал что-то вроде токена / брелка / ключа), и требовал, чтобы пользователь повторно аутентифицировал его или сама при входе в важные области приложения, такие как смена пароля и потенциально опасные действия, шаблоны или поведение, такие как удаление данных, необычные шаблоны использования, массовые действия и т. д.
Сложно защищать приложения и при этом сохранять их простоту использования. Если все сделано осторожно, безопасность может быть реализована способом, который является минимально навязчивым и все же эффективным - в любом случае, для большинства интернет-приложений.