Чтобы предотвратить атаки CSRF, asp.net mvc предоставляет функцию антиподделок ValidateAntiForgeryToken, а в новой версии основного фреймворка asp.net Microsoft предоставляет функции AutoValidateAntiforgeryToken, а именно ValidateAntiForgeryToken и AutoValidateAntiforgeryToken В чём разница, подробно объясню в этой статье.
Концепция CSRF
CSRF Cross-Site Request Forgery, как и XSS-атаки, крайне вредна, можно понять это так: злоумышленник крадёт вашу личность и отправляет вредоносный запрос от вашего имени, который полностью легитимен для сервера, но выполняет ожидаемые действиями, такие как отправка писем и сообщений от вашего имени, кража вашего аккаунта, добавление системных администраторов или даже покупка товаров, переводы виртуальной валюты и т.д. Web A — это сайт с уязвимостью CSRF, Web B — вредоносный сайт, созданный злоумышленником, а Пользователь C — легитимный пользователь Web A.
ASP.NET MVC против атак CSRF
На странице просмотра используйте @Html.AntiForgeryToken() для добавления тега, и когда пользователь обращается к странице, бэкенд автоматически сгенерирует скрытый html-код с этим тегом, следующим образом:
<input name="__RequestVerificationToken" type="скрытый" value="CfDJ8FBn4LzSYglJpE6Q0fWvZ8WDMTgwK49lDU1XGuP5-5j4JlSCML_IDOO3XDL5EOyI_mS2Ux7lLSfI7ASQnIIxo2ScEJvnABf9v51TUZl_iM2S63zuiPK4lcXRPa_KUUDbK-LS4HD16pJusFRppj-dEGc" /> Фоновой контроллер должен быть настроен [ValidateAntiForgeryToken] функция предотвращения подделки документов.
ValidateAntiForgeryToken и AutoValidateAntiforgeryToken отличаются
AutoValidateAntiforgeryTokenAuthorizationFilter наследует ValidateAntiforgeryTokenAuthorizationFilter, но переписывает в нём только метод ShouldValidate.
AutoValidateAntiforgeryToken — свойство, которое вызывает валидацию токенов против подделок для всех небезопасных HTTP-методов.HTTP-методы, кроме GET, HEAD, OPTIONS и TRACE, требуют токена против подделок。 Это можно применить как глобальный фильтр для запуска по умолчанию валидации токена по противоподделке приложения.
Вход по гиперссылке виден.
AutoValidateAntiforgeryTokenAttribute проверяет вызов AutoValidateAntiforgeryTokenAuthorizationFilter, который наследует от ValidateAntiforgeryTokenAuthorizationFilter,Метод ShouldValidate был переписан, возврат true означает, что его нужно проверить, а возврат false не будет проверен, как показано на рисунке ниже:
Проанализируйте исходный код:
AutoValidateAntiforgeryTokenAttribute позволяет глобально применять проверку токенов против подделок ко всем небезопасным методам, таким как POST, PUT, PATCH и DELETE. Так что вам не нужно добавлять свойство [ValidateAntiForgeryToken] к каждому действию, которое это требует.
Чтобы использовать его, добавьте следующий код в метод запуска класса ConfigureServices:
Если нужно игнорировать аутентификацию против подделок, вы можете добавить [IgnoreAntiforgeryTokenприписывают этому действию.
Иногда вам может придётся отмечать несколько запросов на контроллере, а некоторые запросы не требуют подделки, например, различные операции на основе GET. Существует несколько инструментов, которые помогут сделать процесс более удобным и комфортным. Первый — это свойство AutoValidateAntiforgeryToken. Он ведёт себя как свойство ValidateAntiForgeryToken. Однако он автоматически игнорирует действия, вызываемые методами поиска данных: GET, HEAD, OPTIONS и TRACE. Это позволяет быстро и легко добавить методы противоподделки ко всем методам, которые могут изменять данные, не влияя на способ их извлечения.
Следующий код является примером свойства AutoValidateAntiforgeryToken:
В этом примере обе обычные операции Index (GET) будут работать независимо от источника, тогда как операция Index с методом POST и операция RemoveUser как метод Delete потребуют от клиента использования токена против подделок.
Настройте соответствующую информацию
Многие могут задаться вопросом, можно ли заменить имя сгенерированного скрытого домена на их собственное, и можно ли изменить имя cookie на своё.
Ответ — да, давайте кратко продемонстрируем:
В методе ConfigureServices стартапа добавьте следующее, чтобы соответственно изменить имя по умолчанию.
Примечание: главное отличие между asp.net ядром и asp.net заключается в том,Core поддерживает передачу параметров валидации путём запроса заголовка, а не формировать формы!
private const string AntiforgeryTokenFieldName = "__RequestVerificationToken"; private const string AntiforgeryTokenHeaderName = "RequestVerificationToken";
Вы можете посмотреть исходный код:Вход по гиперссылке виден.
Тестовый код:
Результат: Попытка получить доступ к методу test1 возвращает ошибку 400, доступ к методу test2 возвращает переданный параметр str, и вы видите, что функция AutoValidateAntiforgeryToken не перехватывает запрос GET.
(Конец)
|