Используете токен сеанса или одноразовый номер для защиты от подделки межсайтовых запросов (CSRF)?

Я унаследовал некоторый код, который недавно подвергся атаке, когда злоумышленник повторно отправлял удаленные формы.

Я реализовал предотвращение, используя маркер аутентификации сеанса, который я создаю для каждого пользователя (а не идентификатор сеанса). Хотя я понимаю, что эта конкретная атака не является CSRF, я адаптировал свое решение из этих сообщений (хотя и устаревших).

Тем не менее, он все еще чувствует, что здесь есть некоторая уязвимость. Хотя я понимаю, что ничто не является безопасным на 100%, у меня есть несколько вопросов:

  • Разве потенциальный злоумышленник не может просто начать действительный сеанс, а затем включить идентификатор сеанса (через файл cookie) в каждый из своих запросов?
  • Кажется, nonce лучше, чем токен сеанса. Как лучше всего создать и отслеживать одноразовый номер?
  • Я столкнулся с некоторыми моментами, когда эти решения были только одним окном. Может ли кто-нибудь уточнить этот момент?
  • Всегда ли эти решения требуют сеанса? Или эти токены можно создать без сеанса? ОБНОВЛЕНИЕ, эта конкретная страница представляет собой всего лишь одностраничную форму (без входа в систему). Таким образом, запуск сеанса только для генерации токена кажется чрезмерным.
  • Есть ли более простое решение (не CAPTCHA), которое я мог бы реализовать для защиты от этой конкретной атаки, которая не использует сеансы.

В конце концов, я ищу лучшее понимание, чтобы я мог реализовать более надежное решение.


person Jason McCreary    schedule 03.08.2011    source источник
comment
Не могли бы вы указать конкретную схему атаки, которая была совершена на вашем сайте? Ваше последнее обновление сообщения делает крайне маловероятным, что у вас была простая атака CSRF — они обычно используют уязвимости сеанса (в вики их даже называют сеансом езды). Похоже, вашу проблему с формой можно легко решить с помощью капчи.   -  person XzKto    schedule 04.08.2011
comment
Это была автоматизированная атака, когда они отправляли удаленные формы. CAPTCHA могла предотвратить такую ​​атаку. Тем не менее, я все еще заинтересован в защите формы более надежным способом. В идеале не ухудшать UX с помощью CAPTCHA. Следовательно, токен сеанса или одноразовый номер.   -  person Jason McCreary    schedule 04.08.2011
comment
Это именно то, что делают боты — они автоматически отправляют некоторые формы — это не CSRF-атака. Если придумать какую-нибудь защиту от ботов без обратного теста Тьюринга, то можно совершить революцию в Интернете :) Удачи!   -  person XzKto    schedule 05.08.2011
comment
Справедливый. Как упоминалось ранее, меня по-прежнему интересуют токены сеанса/одноразовые номера, поскольку они связаны с защитой CSRF. Хотя я ценю сарказм, ваши комментарии не очень полезны.   -  person Jason McCreary    schedule 05.08.2011
comment
Ну, вы задали вопрос про CSRF-атаки, а потом оказалось, что у вас даже нет сессии (главное, чтобы этот тип атак опирался). Я думаю, вам следует удалить этот вопрос и создать новый, так как это вообще не имеет смысла. Я думаю, что это причина, по которой другой парень удалил свой ответ. Вы должны прочитать en.wikipedia.org/wiki/Cross-site_request_forgery о том, что это за атака на самом деле.   -  person XzKto    schedule 05.08.2011
comment
Я внес некоторые изменения, но в остальном вопрос выражает мои потребности - Я ищу лучшее понимание, чтобы я мог реализовать более надежное решение.   -  person Jason McCreary    schedule 05.08.2011
comment
Я немного обновил свой пост, чтобы дать вам несколько советов по предотвращению атак ботов, но на самом деле — просто закройте этот вопрос и создайте новый хороший вопрос с щедростью: у вас есть много очков, которые можно потратить. Bounty-вопросы привлекают гораздо больше топ-пользователей, чем обычные — вы получите гораздо больше полезных комментариев (как я уверен, вы знаете). Я могу пометить этот вопрос вводящим в заблуждение заголовком или чем-то еще, если хотите (я не знаю, можете ли вы закрыть свой вопрос самостоятельно).   -  person XzKto    schedule 08.08.2011


Ответы (1)


Насколько я понимаю, вам нужно сделать три вещи: сделать все ваши действия по изменению данных доступными только с POST-запросом, запретить POST-запросы без действительного реферера (он должен быть из того же домена) и проверять токен аутентификации в каждом POST-запросе ( Значение токена POST должно быть таким же, как токен в файле cookie).

Первые два сделают действительно сложным выполнение любого вредоносного CSRF-запроса, поскольку они обычно представляют собой скрытые изображения в электронных письмах, на других сайтах и ​​т. д., а выполнение междоменного POST-запроса с действительным реферером должно быть невозможным/сложным в современных браузерах. Это сделает совершенно невозможным выполнение каких-либо вредоносных действий без кражи пользовательских файлов cookie / прослушивания его трафика.

Теперь о ваших вопросах:

  1. Этот вопрос меня действительно смущает: если вы правильно используете токены аутентификации, тогда злоумышленник должен знать токен пользователя из файла cookie, чтобы отправить его вместе с запросом, так почему запуск действительного собственного сеанса злоумышленника может причинить какой-либо вред?
  2. Nonces сделают все ваши ссылки уродливыми — я никогда не видел, чтобы кто-то их использовал. И я думаю, что ваш сайт можно дозировать, используя его, так как вы должны сохранять/искать все анонсы в базе данных - большое количество запросов на создание анонсов может очень быстро увеличить размер вашей базы данных (и поиск их будет медленным).
  3. Если вы разрешите только одно уведомление на user_id для предотвращения (2) Dos-атаки, то, если пользователь откроет страницу, затем откроет другую страницу, а затем отправит первую страницу, его запрос будет отклонен, так как новое сообщение было сгенерировано, а старое уже недействителен.
  4. Как еще вы будете идентифицировать уникального пользователя без идентификатора сеанса, будь то файл cookie, переменная GET или POST?

UPD: Поскольку мы больше не говорим о CSRF: вы можете реализовать множество непонятных защит, которые не позволят роботам-паукам отправить вашу форму:

  1. Скрытые поля формы, которые не должны быть заполнены (боты обычно заполняют большинство полей формы, которые они видят, которые имеют хорошие названия, даже если они действительно скрыты для пользователя)
  2. Трекеры мыши Javascript (вы можете анализировать записанные движения мыши для обнаружения ботов)
  3. Анализ журналов файловых запросов (при загрузке страницы в большинстве случаев должны загружаться javascript/css/images, но у некоторых (очень редких) пользователей это отключено)
  4. Изменения формы Javascript (когда скрытое (или нет) поле добавляется в форму с javascript, который требуется на стороне сервера: боты обычно не выполняют javascript)
  5. Инструменты анализа трафика, такие как Snort, для обнаружения шаблонов ботов (странные пользовательские агенты, слишком быстрая отправка форм и т. д.).

и многое другое, но, в конце концов, некоторые современные боты используют полную эмуляцию поведения реального пользователя (используя реальные вызовы API браузера), поэтому, если кто-то действительно захочет атаковать ваш сайт, никакая защита, подобная этой, не поможет. помочь тебе. Даже CAPTCHA сегодня не очень надежна - помимо сложных алгоритмов распознавания изображений теперь можно купить 1000 CAPTCHA, решенных человеком, для любого сайта всего за 1 доллар (такие услуги можно найти в основном в развивающихся странах). Так что действительно, 100% защиты от ботов не бывает - каждый случай индивидуален: иногда вам придется создавать сложную систему защиты самостоятельно, иногда поможет небольшая настройка.

person XzKto    schedule 03.08.2011
comment
+1 Хорошее замечание о накладных расходах истинной реализации nonce. - person Jason McCreary; 03.08.2011
comment
Учитывая вашу настойчивость, я отметил это как ответ. Тем не менее, я опубликовал еще один вопрос. - person Jason McCreary; 09.08.2011
comment
Ну не надо было принимать этот ответ - я просил закрыть квест. Подобные вопросы действительно затрудняют поиск соответствующей информации о SO. А по теме - думаю, вы узнаете, что люди ответят на этот вопрос так же, как и я (текущие ответы в новой теме повторяют мой ответ). - person XzKto; 10.08.2011
comment
Ваш ответ полезен, и я использовал предоставленную вами информацию. Поэтому я пометил это как таковое и думаю, что кому-то еще это будет полезно. - person Jason McCreary; 10.08.2011