Согласно моим исследованиям, правильный способ защиты от этого — установить NONCE для каждого запроса GET, который возвращает форму, а затем проверить наличие NONCE в запросе POST. Тем не менее, кто-то все еще может написать сценарий, чтобы ПОЛУЧИТЬ мою форму вместе с NONCE, а затем отправить ее обратно с помощью NONCE.
Поскольку это такая широко известная уязвимость, не должны ли браузеры уже позаботиться об этом, запретив междоменные вызовы ajax? Если нет, то есть ли в ASP.NET MVC 4 встроенный механизм защиты от этого?
Должен ли я защищаться от подделки междоменных запросов?
Ответы (3)
Да, есть встроенный механизм. HtmlHelper.AntiForgeryToken, который может быть используется для защиты вашего приложения от подделки межсайтовых запросов. Чтобы использовать эту функцию, вызовите метод AntiForgeryToken из формы и добавьте атрибут ValidateAntiForgeryTokenAttribute для метода действия, который вы хотите защитить.
CSHTML-файл:
@Html.AntiForgeryToken()
Контроллер:
[ValidateAntiForgeryToken]
public ActionResult Edit(User updatedUser)
Вы заметите, что токен включает в себя две меры безопасности — поле формы и файл cookie:
Чтобы сгенерировать маркеры анти-XSRF, вызовите метод @Html.AntiForgeryToken() из представления MVC или @AntiForgery.GetHtml() со страницы Razor. Затем среда выполнения выполнит следующие шаги:
Если текущий HTTP-запрос уже содержит токен сеанса анти-XSRF (файл cookie анти-XSRF __RequestVerificationToken), токен безопасности извлекается из него. Если HTTP-запрос не содержит токена сеанса защиты от XSRF или извлечение токена безопасности завершается сбоем, будет создан новый случайный токен защиты от XSRF.
Маркер поля анти-XSRF создается с использованием маркера безопасности из шага (1) выше и удостоверения текущего вошедшего в систему пользователя.
Если на шаге (1) был сгенерирован новый токен анти-XSRF, будет создан новый токен сеанса, содержащий его, и он будет добавлен в коллекцию исходящих файлов cookie HTTP. Маркер поля из шага (2) будет заключен в элемент, и эта HTML-разметка будет возвращаемым значением Html.AntiForgeryToken() или AntiForgery.GetHtml().
Чтение:
AntiForgeryToken
состоит не только из поля формы, но и из файла cookie. Злоумышленник не сможет подделать или прочитать файл cookie, принадлежащий вашему домену.
- person MikeSmithDev; 06.12.2013
Эти одноразовые номера используются для защиты от подделок межсайтовых запросов. Для этого не требуется междоменный вызов ajax, и браузеры имеют защиту от них. CSRF — это уязвимость, потому что когда браузер вызывает ваш сайт, он отправляет информацию о сеансе для вашего сайта, независимо от страницы, которая сообщила браузеру о выполнении вызова. Браузеру можно указать сделать запрос на получение вашего site.com, включив тег img на evilsite.com, который указывает на страницу на вашем site.com. Если, когда этот запрос на получение обрабатывается yoursite.com, вы проверяете одноразовый номер, нет никакого способа, чтобы диск evilsite.com узнал этот одноразовый номер. Аналогичные вещи можно сделать и для почтовых запросов.
На этой странице, похоже, есть некоторая информация о том, как смягчить это в ASP.NET MVC: http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages
Привет, Стефан
<img>
, но я могу сделать запрос GET, используя AJAX и JSONP.
- person AxiomaticNexus; 06.12.2013
Вы также должны взглянуть на концепцию защиты от CSRF без сохранения состояния. Для этого есть 2 стандартных подхода: шаблон зашифрованного токена и шаблон двойной отправки файла cookie. Шаблон зашифрованного токена использует токен, зашифрованный Rijndael, который содержит встроенное одноразовое значение, которое не может быть прочитано сценариями и является очень надежной криптографической структурой.