Як запобігти атакам CSRF в ASP.NET Core

Як запобігти атакам CSRF в ASP.NET Core

ІТ

Підробка міжсайтових запитів (CSRF)-це атака, яка змушує кінцевого користувача здійснювати небажані дії під час входу у веб-додаток. Атака CSRF використовує дозволи автентифікованого користувача і змушує жертву виконувати певні дії, які принесуть зловмиснику користь. Наприклад, атаку CSRF можна використати для здійснення покупки на веб -сайті або переказу грошей з банківського рахунку жертви.

У цій статті розповідається про атаки CSRF, як вони працюють і як запобігти таким атакам у ASP.NET Core 6. Щоб запустити приклади коду, наведені в цій статті, у вашій системі має бути встановлено Visual Studio 2022. Якщо у вас ще немає копії, ви можете завантажити Visual Studio 2022 тут.

Створіть проект ASP.NET Core MVC у Visual Studio 2022

Спочатку створимо проект ASP.NET Core 6 у Visual Studio 2022. Зробіть наступне:

  1. Запустіть IDE Visual Studio 2022.
  2. Натисніть «Створити новий проект».
  3. У вікні “Створити новий проект” виберіть “ASP.NET Core Web App (Model-View-Controller)” зі списку шаблонів, що відображається.
  4. Натисніть далі.
  5. У вікні “Налаштувати новий проект” введіть назву та місце розташування нового проекту.
  6. За бажанням активуйте прапорець “Зберігати рішення та проект у одному каталозі”, залежно від ваших уподобань.
  7. Натисніть далі.
  8. У наступному вікні виберіть “Додаткова інформація” зі спадного списку вище .NET 6.0 (Попередній перегляд) як цільову структуру. Залиште “Тип автентифікації” на “Ні” (за замовчуванням).
  9. Переконайтеся, що прапорці «Увімкнути Docker», «Налаштувати для HTTPS» та «Увімкнути компіляцію середовища виконання Razor» не зняті, оскільки ми не використовуємо жодних із цих функцій тут.
  10. Натисніть кнопку Створити.

Це створить новий проект ASP.NET Core MVC 6 у Visual Studio. Ми будемо використовувати цей проект у наступних розділах цієї статті.

Як працюють атаки CSRF?

Підробка міжсайтових запитів-це тип атаки, під час якої зловмисник надсилає шкідливе повідомлення веб-програмі, яка використовує файли cookie аутентифікації жертви. Найчастіше ці атаки здійснюються шляхом обману користувачів із фішинг -листами, щоб заманити їх на шкідливі веб -сайти. Давайте розберемося, як працює ця атака.

Наприклад, припустимо, що ви увійшли на веб -сайт банку за допомогою автентифікації форм. Сервер видає вам файл cookie для автентифікації, і цей файл cookie встановлено у вашому веб -браузері. Якщо банківський веб -сайт довіряє запиту, якщо він містить файл cookie для автентифікації, умови для атаки CSRF дозріли.

Наприклад, припустимо, що зловмисник надсилає вам посилання в електронному листі, який, здається, надходить із вашого банку. Якщо ви натискаєте посилання під час входу у свій банк, шкідливий веб -сайт зловмисника може надсилати запити POST назад на веб -сайт банку. Шкідливий веб -сайт може навіть спробувати вставити або видалити дані з вашого банку, оскільки ви вже автентифіковані. Зловмисник міг перевести кошти з вашого рахунку на рахунок зловмисника.

Атаки CSRF можливі у веб -програмах, які використовують файли cookie для автентифікації, оскільки:

  • Файли cookie зберігаються у веб -браузерах.
  • Збережені файли cookie включають файли cookie сеансу для всіх автентифікованих користувачів.
  • Незалежно від того, як було створено запит, веб -браузери передають усі файли cookie, призначені для домену, веб -програмі.

Використання токенів проти підробки в ASP.NET Core

Ви можете захистити користувачів своїх програм ASP.NET Core від атак CSRF, використовуючи маркери проти підробки. Якщо ви додаєте до своєї програми маркери захисту від підробки, на кожен сервер POST надсилаються два різних значення. Одне зі значень надсилається як файл cookie веб -переглядача, а одне як дані форми.

Якщо сервер не отримує обидва значення, він відмовляється продовжувати запит. Таким чином, сервер гарантує, що всі законні запити повинні надходити безпосередньо від клієнта, а не від зовнішнього джерела. Зауважте, що хоча веб -браузери автоматично надсилатимуть cookie, нам потрібно буде створити інший маркер, наданий у формі.

Програми ASP.NET Core Razor Pages за замовчуванням надають маркер захисту від підробки для форм сторінки. Все, що вам потрібно зробити, це застосувати відповідну перевірку. Однак, якщо ви використовуєте програму ASP.NET Core (не MVC) з нуля, вам доведеться вручну додати пакет Microsoft.AspNetCore.Antiforgery до вашого проекту та зареєструвати служби.

У наведеному нижче фрагменті коду показано, як налаштувати процес створення маркера за допомогою функції AddAntiforgery в методі ConfigureServices класу Startup:

services.AddAntiforgery(options => 
{ 
      options.FormFieldName = "MyAntiForgeryField"; 
      options.HeaderName = "MyAntiForgeryHeader"; 
      options.Cookie.Name = "MyAntiForgeryCookie"; 
});

Токен проти підробки (також відомий як маркер CSRF)-це унікальний, секретний і випадковий параметр, який генерується додатком на стороні сервера для наступного запиту HTTP від ​​клієнта. Сервер порівнює запитуваний параметр з очікуваним значенням і відхиляє запити, якщо параметр неправильний або відсутній.

Сторінки бритви ASP.NET за замовчуванням включають підтримку маркерів проти підробки. Під час виконання помічник тегу форми автоматично відображає приховане поле, яке містить маркер захисту від підробки. Давайте зрозуміємо це на прикладі. Розглянемо такий помічник тегів:

<form method="post">
    @Html.AntiForgeryToken() 
</form>

Під час виконання цей помічник тегів генерує такий HTML -код:

<form method="post">     
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8MZ1yRS5ySZJqjGnctAjlJcuQEPXqJHkCYWpvhGPis3j1s7cUUZByFfabzIP0xlz2kWwbaXZQ86hzrHmeU5DlD-u8DHmg_a5PhLwDcpJSdpnO4bHtE_X2OksjQW2uRp7ZWdnf1d0hcJZ1eAWtUNabHw" />
</form>

Це запобігає атакам XSRF / CSRF на наші веб -сайти Razor.

Перевіряйте токени проти підробки в ASP.NET Core

Ви можете програмно перевірити маркери CSRF в ASP.NET Core. Розглянемо наступний спосіб дій:

 [HttpPost]
 public async Task<ActionResult<int>> UpdateStock(int noOfItemsSold)
 {
      if (! await IsAntiForgeryTokenValid())
          return BadRequest();
      //Write your code here...
       return Ok();
  }

І ось вищезгаданий метод IsAntiForgeryTokenValid:

private async Task<bool> IsAntiForgeryTokenValid()
{
     try
     {
          await antiForgery.ValidateRequestAsync(this.HttpContext);
          return true;
     }
     catch (AntiforgeryValidationException)
     {
          return false;
     }
}

Крім того, ви можете використовувати атрибут AutoValidateAntiForgeryToken замість атрибута ValidateAntiForgeryToken. Перший працює аналогічно другому, але не вимагає токенів для запитів, зроблених за допомогою методів HTTP, які використовують дієслова GET, HEAD, OPTIONS та TRACE.

У наведеному нижче фрагменті коду показано, як можна вказати атрибут AutoValidateAntiForgeryToken у вашому контролері.

[AutoValidateAntiforgeryToken]
public class HomeController : Controller
{
    //The action methods go here
}

Ви також можете вказати цей атрибут глобально. Наступний фрагмент коду демонструє, як можна використовувати цей атрибут у всьому світі в методі ConfigureServices класу Startup.

public void ConfigureServices(IServiceCollection services)
{
   services.AddControllersWithViews(options =>
   options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()));
}

Перевизначення атрибутів, захищених від підробки, у ASP.NET Core

Нарешті, також можна змінити атрибути проти підробки. Наприклад, ви можете змінити назву файлу cookie або вказати назву поля або назву заголовка. Вам може знадобитися, щоб час виконання ASP.NET Core шукав маркер у заголовку, а не файл cookie. (Зберігання даних у заголовку запиту завжди більш безпечне, ніж їх зберігання у файлі cookie.) Крім того, ваше ім’я cookie може мати іншу назву, ніж очікується під час виконання ASP.NET Core.

Щоб змінити атрибути захисту від підробки, можна скористатися фільтром IgnoreAntiforgeryToken, як показано в наведеному нижче фрагменті коду.

[AutoValidateAntiforgeryToken]
public class HomeController : Controller
{
    [HttpPost]
    [IgnoreAntiforgeryToken]
    public async Task<IActionResult> MySafeMethod(MyViewModel model)
    {
        //Antiforgery token is not required
    }
}

Найкращі практики запобігання атакам CSRF

Ви можете слідувати наведеним нижче кращим практикам для запобігання атакам CSRF:

  • Переконайтеся, що антивірусне програмне забезпечення оновлено.
  • Не зберігайте будь -яку інформацію для входу у веб -браузер.
  • Регулярно видаляйте файли cookie зі свого веб -браузера.
  • Вимкніть сценарії у веб -браузері.
  • Реалізуйте двофакторну автентифікацію.
  • Вийдіть зі своїх програм, коли вони не використовуються.
  • Регулярно перевіряйте свої пристрої на наявність шкідливого програмного забезпечення.

Файли cookie – не єдина ціль атак CSRF. І основна, і дайджест -автентифікація порушені. Після входу користувача за допомогою базової або дайджест -автентифікації браузер передає облікові дані користувачу до закінчення сеансу. Атаки CSRF можуть використовувати це вікно безпеки.

Ви можете захистити користувачів своїх програм ASP.NET Core за допомогою маркерів проти підробки. Програми ASP.NET Core MVC автоматично містять маркери, захищені від підробки, але їх потрібно додавати вручну в інші проекти ASP.NET Core. Нарешті, зверніть увагу, що ASP.NET Core не генерує маркери захисту від підробки для безпечних методів HTTP (GET, HEAD, OPTIONS та TRACE).

Залишити відповідь