Как предотвратить CSRF-атаку с помощью запроса Anti Forgery GET

Мой вопрос касается ASP.NET MVC 5 относительно атаки XSS/CSRF.

ASP.NET MVC позволяет предотвратить атаку CSRF путем создания маркера защиты от подделки.

Но этот токен можно использовать только с запросом POST.

Согласно моей команде тестирования, чтобы предотвратить атаку CSRF, каждый запрос должен иметь номер токена, и они просят иметь только запрос POST, а не один запрос GET.

поэтому мой вопрос:

  1. Нужен ли нам запрос POST только для предотвращения атаки CSRF?

  2. Как мы можем сгенерировать и отправить токен защиты от подделки через запрос GET?


person Sham    schedule 07.07.2014    source источник
comment
Antiforgerytoken в asp.net mvc всегда создает скрытое поле на вашей html-странице, если вы хотите использовать этот токен защиты от подделки в случае запроса на получение ajax, тогда вы можете получить значение токена с помощью jquery, выбрав токен через идентификатор или класс...   -  person    schedule 07.07.2014


Ответы (2)


Если у вас есть страницы, отображающие информацию для пользователя, то это должны быть GET методы.

Примеры GETs:-

  • Просмотр корзины.
  • Показать форму сведений о пользователе.
  • Показать продукт.

Однако, если страница вносит изменения в базу данных или вносит постоянные изменения (например, отправляет данные карты), то они должны быть POST.

Примеры POSTs:-

  • Страница, которая вызывается при сохранении/изменении корзины.
  • Страница, которая вызывается при сохранении сведений о пользователе.
  • Авторизоваться.
  • Выход из системы (легко пропустить - обычно сайты реализуют это как GET).

Если ваш сайт использует правильный метод для каждого действия, вам нужно реализовать защиту CSRF только для POST методов. Однако, если вы случайно использовали GET вместо POST (например, при выходе из системы), то исправление для этого состоит в том, чтобы передать токен CSRF по строке запроса (например, www.example.com/UserAccount/Logout?token=12345) — хотя рекомендуется изменить на POST.

В этом случае вам придется написать собственный код для проверки токена, поскольку ASP.NET MVC ValidateAntiForgeryToken работает только с POST запросами. См. здесь как сделать ValidateAntiForgeryToken работать с GET.

person SilverlightFox    schedule 08.07.2014

Это невозможно сделать с помощью get, требуется POST, и основная причина заключается в том, что HTTP GET должен быть идемпотентный, и он не должен изменять какое-либо поведение в приложении, его следует использовать только для получения данных.

Поэтому, если вы меняете поведение из GET, сделайте это POST, а затем вы можете использовать Anti Forgery Token.

person Ashish Rajput    schedule 07.07.2014
comment
+1 Я добавил ссылку на RFC2616 (HTTP), в которой объясняются безопасные и идемпотентные методы. - person jgauffin; 07.07.2014
comment
@jgauffin: Хотя GET должен быть safe, а не только idempotent. - person SilverlightFox; 24.09.2014