ValidateAntiForgeryToken цель, объяснение и пример

310

Не могли бы вы объяснить цель ValidateAntiForgeryToken и показать пример ValidateAntiForgeryTokenв MVC 4?

Я не мог найти примеры, которые объясняют этот атрибут?

Тебриз Атайи
источник
8
Проверьте это сообщение prideparrot.com/blog/archive/2012/7/…
VJAI
1
Между прочим, я действительно не понимаю, почему MS не позволила поместить это прямо в .BeginFormпомощника. Так что это происходит автоматически, как в Rails
jazzcat

Ответы:

350

Поддержка защиты от подделки MVC записывает уникальное значение в файл cookie только для HTTP, а затем то же значение записывается в форму. Когда страница отправляется, возникает ошибка, если значение cookie не соответствует значению формы.

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

Эта функция не предотвращает любые другие типы подделки данных или атаки, основанные на фальсификации.

Чтобы использовать его, украсьте метод действия или контроллер ValidateAntiForgeryTokenатрибутом и вызовите его @Html.AntiForgeryToken()в формах, публикуемых в методе.

Ричард Сзалай
источник
5
@Cris Это оба. Согласно моему ответу: «записывает уникальное значение в файл cookie только для HTTP, а затем в форму записывается то же значение »
Ричард Сзалай
21
Почему это не установлено по умолчанию?
Кристиан Хагелид
12
@ Кристиан, потому что это не Ruby on Rails. ;-)
Мартин Каподичи
6
Кажется, что форма __RequestVerificationToken и cookie __RequestVerificationToken не совпадают, они работают как пара.
WaiKit Kung
5
@rdans Совсем нет, CORS и CSRF совершенно разные. CORS предназначен для того, чтобы разрешить другим доменам доступ к API на вашем сервере, а CSRF - чтобы убедиться, что сообщение формы пришло со страницы, на которую вы ожидали.
Ричард
52

Основное назначение атрибута ValidateAntiForgeryToken - предотвратить атаки подделки межсайтовых запросов.

Подделка межсайтовых запросов - это атака, при которой вредоносный элемент сценария, вредоносная команда или код отправляются из браузера доверенного пользователя. Для получения дополнительной информации об этом, пожалуйста, посетите http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages .

Он прост в использовании, вам нужно украсить метод с помощью атрибута ValidateAntiForgeryToken, как показано ниже:

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult CreateProduct(Product product)  
{
  if (ModelState.IsValid)  
  {
    //your logic 
  }
  return View(ModelName);
}

Он получен из пространства имен System.Web.Mvc.

И по вашему мнению, добавьте этот код, чтобы добавить токен, чтобы он использовался для проверки формы при отправке.

@Html.AntiForgeryToken()
Чандра Малла
источник
Да, вы правы, вам нужно вызвать @ Html.AntiForgeryToken () из вашей формы и добавить ValidateAntiForgeryTokenAttribute в метод действия, который вы хотите защитить.
Чандра Малла
Спасибо за этот простой для понимания ответ :)
noobprogrammer
4

В ASP.Net Core токен защиты от подделки автоматически добавляется в формы, поэтому вам не нужно добавлять его, @Html.AntiForgeryToken()если вы используете бритвенный элемент формы или IHtmlHelper.BeginForm и если метод формы не GET.

Он сгенерирует элемент ввода для вашей формы, подобный следующему: <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

И когда пользователь отправляет форму, этот токен проверяется на стороне сервера, если проверка включена.

[ValidateAntiForgeryToken]Атрибут может быть использован против действий. Запросы к действиям, к которым применен этот фильтр, блокируются, если в запросе не указан допустимый токен защиты от подделки.

[AutoValidateAntiforgeryToken]Атрибут может быть использован против контроллеров. Этот атрибут работает идентично атрибуту ValidateAntiForgeryToken, за исключением того, что он не требует токенов для запросов, выполненных с использованием следующих методов HTTP: GET HEAD OPTIONS TRACE

Дополнительная информация: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery

tscissors
источник
2

Microsoft предоставляет нам встроенные функции, которые мы используем в нашем приложении в целях безопасности, поэтому никто не может взломать наш сайт или проникнуть в какую-либо важную информацию.

От цели ValidateAntiForgeryToken в приложении MVC Харприта Сингха:

Использование ValidateAntiForgeryToken

Давайте попробуем на простом примере понять эту концепцию. Я не хочу делать это слишком сложным, поэтому я собираюсь использовать шаблон приложения MVC, уже доступного в Visual Studio. Мы сделаем это шаг за шагом. Давайте начнем.

  1. Шаг 1. Создайте два приложения MVC с интернет-шаблоном по умолчанию и присвойте им имена CrossSite_RequestForgery и Attack_Application соответственно.

  2. Теперь откройте веб-конфигурацию приложения CrossSite_RequestForgery и измените строку подключения на приведенную ниже, а затем сохраните.

`

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. Теперь нажмите Инструменты >> Диспетчер пакетов NuGet, затем Консоль диспетчера пакетов.

  2. Теперь запустите указанные ниже три команды в консоли диспетчера пакетов, чтобы создать базу данных.

Enable-Migrations add -igration первое обновление базы данных

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

  1. Теперь откройте Account Controller. Здесь вы увидите метод register, тип которого post. Над этим методом должен быть доступный атрибут как [ValidateAntiForgeryToken]. Прокомментируйте этот атрибут. Теперь щелкните правой кнопкой мыши на регистре и нажмите Перейти. Там снова вы найдете html-помощник как @ Html.AntiForgeryToken (). Прокомментируйте это тоже. Запустите приложение и нажмите кнопку регистрации. URL будет открыт как:

HTTP: // локальный: 52269 / Account / Регистрация

Примечания. Теперь я знаю, что у всех читателей возникает вопрос: зачем комментировать этих двух помощников, поскольку все знают, что они используются для проверки запроса. Затем я просто хочу, чтобы вы все знали, что это просто потому, что я хочу показать разницу после и до применения этих помощников.

  1. Теперь откройте второе приложение Attack_Application. Затем откройте метод Register Account Controller. Просто измените метод POST на простой, показанный ниже.

    Форма регистрации
    1. @ Html.LabelFor (m => m.UserName) @ Html.TextBoxFor (m => m.UserName)
    2. @ Html.LabelFor (m => m.Password) @ Html.PasswordFor (m => m.Password)
    3. @ Html.LabelFor (m => m.ConfirmPassword) @ Html.PasswordFor (m => m.ConfirmPassword)

7. Теперь предположим, что вы хакер и знаете URL-адрес, по которому вы можете зарегистрировать пользователя в приложении CrossSite_RequestForgery. Теперь вы создали сайт подделки в виде Attacker_Application и просто поместили тот же URL в метод post.

8. Запустите это приложение сейчас и заполните поля регистра и нажмите на регистр. Вы увидите, что вы зарегистрированы в приложении CrossSite_RequestForgery. Если вы проверите базу данных приложения CrossSite_RequestForgery, то увидите и введенную вами запись.

  1. Важно. Теперь откройте приложение CrossSite_RequestForgery, закомментируйте токен в контроллере учетной записи и зарегистрируйте представление. Попробуйте зарегистрироваться еще раз с тем же процессом. Затем произойдет ошибка, как показано ниже.

Ошибка сервера в приложении '/' ________________________________________ Требуемый файл cookie для защиты от подделки "__RequestVerificationToken" отсутствует.

Это то, что говорится в концепции. То, что мы добавляем в View, т.е. @ Html.AntiForgeryToken (), генерирует __RequestVerificationToken во время загрузки и [ValidateAntiForgeryToken], доступный в методе Controller. Сопоставьте этот токен на время публикации. Если токен совпадает, это означает, что это действительный запрос.

Винаяк Савале
источник
3
скопировано из c-sharpcorner.com/article/...
Мухаммед Дауд Ансари