Как предотвратить атаки CSRF в ASP.NET Core

автор vadim


Подделка межсайтовых запросов (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. Запустите интегрированную среду разработки 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 в методе ConfigurationServices класса Startup:

services.AddAntiforgery(options => 

      options.FormFieldName = "MyAntiForgeryField"; 
      options.HeaderName = "MyAntiForgeryHeader"; 
      options.Cookie.Name = "MyAntiForgeryCookie"; 
}); 

Токен защиты от подделки (также известный как токен CSRF) — это уникальный, секретный и случайный параметр, создаваемый серверным приложением для последующего HTTP-запроса клиента. Сервер сравнивает запрошенный параметр с ожидаемым значением и отклоняет запросы, если параметр неверен или отсутствует.

Страницы ASP.NET Razor по умолчанию обеспечивают поддержку токенов защиты от подделки. Во время выполнения помощник тега формы автоматически отображает скрытое поле, содержащее токен защиты от подделки. Давайте разберемся в этом на примере. Рассмотрим следующий помощник тегов:

<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
}

Вы также можете указать этот атрибут глобально. В следующем фрагменте кода показано, как можно использовать этот атрибут глобально, в методе ConfigurationServices класса 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).

Related Posts

Оставить комментарий