Наряду с шифрованием файлов cookie вы также должны внедрить вращающийся токен для предотвращения повторных атак.
Идея состоит в том, что зашифрованный файл cookie содержит некоторое значение, которое можно сравнить с известным значением на сервере. Если данные совпадают, то запрос выполнен успешно. Если данные не совпадают, значит, вы столкнулись с повторной атакой и вам необходимо завершить сеанс.
ОБНОВЛЕНИЕ
В одном из комментариев меня спросили, хотел ли я сохранить значение в файле cookie. Ответ положительный. ВЕСЬ файл cookie должен быть зашифрован, что может быть сделано автоматически с помощью HttpModule. Внутри зашифрованного файла cookie находится любая ваша обычная информация + токен изменения.
В каждом посте назад проверяйте токен. Если он действителен, разрешите транзакцию, создайте новый случайный токен, сохраните его в файле cookie и отправьте обратно в браузер. Опять же, в зашифрованном виде.
В результате ваш файл cookie является безопасным (вы используете 3DES?), и у любого злоумышленника будет крайне ограниченное окно возможностей даже для попытки повторной атаки. Если жетон не прошел проверку, можно было просто забить тревогу и принять соответствующие меры.
Все, что требуется на стороне сервера, — это отслеживать пользователя и его текущий токен. Обычно это гораздо меньшее попадание в БД, чем поиск таких мелочей, как имя пользователя при каждой загрузке страницы.
ОБНОВЛЕНИЕ 2
Я пытался выяснить, лучше это или хуже, чем сохранение изменяющегося значения в сеансе. Вывод, к которому я пришел, заключается в том, что хранение меняющегося значения в сеансе на веб-сервере абсолютно ничего не делает для предотвращения повторных атак и, следовательно, менее безопасно, чем помещение этого значения в файл cookie.
Рассмотрим этот сценарий. Браузер делает запрос. Сервер просматривает идентификатор сеанса и извлекает объекты сеанса, затем выполняется работа, и ответ отправляется обратно в браузер. Тем временем BlackHat Bob зафиксировал транзакцию.
Затем Боб отправляет точно такой же запрос (включая идентификатор сеанса) на сервер. На данный момент у сервера нет абсолютно никакой возможности узнать, что это запрос от злоумышленника. Вы не можете использовать IP, так как они могут измениться из-за использования прокси, вы не можете использовать отпечатки пальцев браузера, так как вся эта информация была бы записана при первоначальном обмене. Кроме того, учитывая, что сеансы обычно длятся не менее 30 минут, а иногда и намного дольше, у злоумышленника есть достаточно большое окно для работы.
Итак, несмотря ни на что, чтобы предотвратить повтор, вы должны отправлять изменяющийся токен в браузер после каждого запроса.
Теперь у нас остается вопрос о том, следует ли также сохранять такие значения, как идентификатор пользователя, в зашифрованном файле cookie или хранить его на стороне сервера в переменной сеанса. С сеансом у вас есть проблемы, такие как более высокая загрузка памяти и процессора, а также потенциальные проблемы с балансировкой нагрузки и т. Д. С файлами cookie у вас есть некоторый объем данных, который составляет менее 4 КБ и, если все сделано правильно, в диапазоне 1 КБ или меньше, который добавляется к каждому запросу. Я предполагаю, что это сведется к тому, хотите ли вы добавить больше серверов большего размера и внутреннего сетевого оборудования для обработки запросов (сессии) или заплатить за немного больший интернет-канал (куки).
person
NotMe
schedule
08.07.2010