Подтвердить что ты не робот

Предотвращает ли AntiForgeryToken в ASP.NET MVC все атаки CSRF?

Использование AntiForgeryToken требует, чтобы каждый запрос передавал действительный токен, поэтому вредоносные веб-страницы с простыми script публикациями данных в моем веб-приложении не удастся.

Но что, если вредоносный script сначала сделает некоторый простой запрос GET (Ajax), чтобы загрузить страницу, содержащую токен антифригации в скрытом поле ввода, извлекает его и использует его для создания допустимого POST?

Возможно ли это, или я чего-то не хватает?

4b9b3361

Ответ 1

Да, это все, что вам нужно сделать.

Пока вы создаете новый токен на каждой защищенной странице, <%= Html.AntiForgeryToken() %> и всегда убедитесь, что он проверен в любом защищенном действии, используя [ValidateAntiForgeryToken]

Это реализует шаблон маркера синхронизатора, как обсуждалось в CryptFort Cheat Sheet в OWASP.

Чтобы script преуспеть в принятии приемлемого запроса, он должен сначала получить форму и прочитать токен, а затем опубликовать токен. Одинаковая политика происхождения будет помешать этому разрешить в браузере. Сайт canot делает HTTP-запрос стиля AJAX на другой сайт; только для себя. Если по какой-то причине одна и та же политика происхождения может быть нарушена, вы станете уязвимыми.

Обратите внимание, что если у вас есть уязвимость межсайтового скриптинга, злоумышленник может злоупотреблять уязвимостью xss, чтобы обойти защиту, предоставленную той же политикой происхождения (поскольку script теперь запущен с вашего собственного сайта, поэтому SOP преуспевает). Введенный script может затем счастливо прочитать и повторно отправить токен. Этот метод для предотвращения защиты CSRF через XSS был распространен в некоторых червях в последнее время. В принципе, если у вас есть XSS, ваша защита CSRF является пустой тратой времени, поэтому убедитесь, что вы тоже не уязвимы.

Еще одна вещь, на которую нужно обратить внимание - это Flash и Silverlight. Обе эти технологии не подписываются на одну и ту же политику происхождения и вместо этого используют файлы политики междоменной политики для ограничения доступа к удаленным ресурсам. Flash/Silverlight script может получать доступ только к ресурсам вашего сайта, если вы публикуете XML файл с перекрестной властью на своем собственном сайте. Если вы публикуете этот файл, только когда-либо разрешаете использовать белый список доверенных сторонних серверов и никогда не разрешаете *.

Подробнее о CSRF в OWASP См. Также: Xat Prevention Cheat Sheet

Ответ 2

Но что, если вредоносный script сделает сначала некоторый простой запрос GET (по AJAX), чтобы загрузить страницу, содержащую токен антикоррекции, в скрытое поле ввода, извлекает ее и использует для создания достоверной POST?

Да, это правда, но если это не заканчивается в браузере, это НЕ атака CSRF.

Если это закончится браузером (например, соскабливанием через HTTP-запрос на стороне сервера), то что произойдет, если код scrape получит токен CSRF. Однако ваши законные, прошедшие проверку подлинности пользователи получат другой токен, установленный на их машине. Поскольку токен, который поднимает скребок, отличается от того, который выдается вашим пользователям, тогда POST завершится неудачно.

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