ASP.NET подделки (XSRF/CSRF) защита в этом ядре

Страница обновлена :
Дата создания страницы :

Среды

Визуальная студия
  • Визуальная студия 2019
ASP.NET ядро
  • 3.0
  • 3.1

Что такое подделка запросов на кросс-сайт?

Кросс-сайт запрос подделки (CSRF/ XSRF) предназначен для тех, которые обрабатываются только в пределах сайта, представляющих интерес. Атака на уязвимость, выполняя такой процесс обновления с внешнего сайта.

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

Поэтому, если вы отправляете аналогичные данные на URL-адрес от кого-то, кроме целевого сайта, Это то же самое лечить вас размещены.

Если бы это сделал только злоумышленник, это не было бы угрозой. Страшная вещь о CSRF является то, что злоумышленники могут создавать поддельные сайты или вставлять скрытые URL-адреса на сайте. Это место, где кто-то другой непреднамеренно получает к нему доступ и становится злоумышленником.

Я не буду входить в углубь здесь, поэтому, пожалуйста, узнайте больше о кросс-сайт запрос подделки.

ASP.NET Core включает эту контрмеру в рамки.

Проверка подделки запроса на кросс-сайт для работы

Попробуйте узнать, действительно ли процесс обновления выполняется с внешних сайтов или инструментов.

Index.cshtml создает входную форму, которая отправляет текст, который вы ввели на сервер. Затем поместите данные просмотра так, чтобы сервер отображал созданные сообщения в соответствии с текстом ввода.

Индекс.cshtml

@{
  ViewData["Title"] = "Home Page";
}

<div class="text-center">
  <h1 class="display-4">Welcome</h1>
  <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<form method="post">
  <input type="text" name="text" />
  <button type="submit">送信</button>
</form>

<p>@ViewData["Message"]</p>

Серверная сторона HomeController.cs обрабатывает отправленный текст и выводит его на след Visual Studio. Установите тот же текст на ViewData, чтобы он мог отображаться клиенту.

HomeController.cs

public class HomeController : Controller
{
  // 省略

  [HttpPost]
  public IActionResult Index(string text)
  {
    System.Diagnostics.Trace.WriteLine($"「{text}」が入力されました。");
    ViewData["Message"] = $"「{text}」が入力されました。";
    return View();
  }

  // 省略
}

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

Обработанный текст отображается на экране, как и ожидалось.

Поскольку это также выход на след, визуальное окно вывода студии также отображает текст. На самом деле, мы делаем такие вещи, как регистрация входных данных в базе данных, но мы не собираемся упрощать код здесь.

Теперь попробуйте получить доступ к программе из-за пределов целевого сайта во время отладки и работы. Для простоты, я буду размещать сообщение с помощью инструмента под названием Visual Studio Code. Если вы можете отправить POST, вы можете использовать другие инструменты или построить другую программу сайта для атаки.

При установке расширения под названием REST Client в Visual Studio Code, Вы можете использовать функцию, которая позволяет легко проверить работу REST API, просто открыв файл .http.

При создании файла .http, аналогичного следующему в текстовом файле, а затем открыть файл в Visual Studio Code, Вы можете отправить GET или POST, нажав на запрос отправки.

Если вы создадите следующие данные POST, вам будет отправлено почти такое же количество данных, как вы вводите текст на экране и нажмите кнопку отправки. (Номер порта Localhost должен быть таким же, как и среда выполнения.)

RestTest.http:/www.restTest.http

### Form で POST 送信
POST https://localhost:44372/home/index HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="text"

なんらかのテキスト
------WebKitFormBoundary7MA4YWxkTrZu0gW--

При отправке можно увидеть, что сервер получает текст и обрабатывает его.

Визуальный код студии может получить результаты. Если присмотреться к коду результатов, то можно увидеть, что отображается значение, установленное для ViewData. (Он отображается в Unicode, но текст отображается правильно, если он просматривается в веб-браузере.)

Адрес кросс-сайт запрос подделки уязвимости

Как я уже упоминал в начале, ASP.NET Core включает меры по борьбе с подделкой запросов на перекрестные участки в рамках. Общей мерой является выдача уникального маркера клиенту заранее на экране, который требует поста и т.д. Вам не нужно принимать обработку, если вы не бросаете маркер на сервер.

Конечно, если вы получаете доступ к URL непосредственно с внешнего сайта, токен неизвестен и не принимает обработку.

Во-первых, я хотел бы поговорить о выпуске токенов для клиента (HTML), но дело в том, что фреймворк не в состоянии сделать это. Пойдю. Если вы указали метод POST в теге формы, можно включить параметры маркера в HTML без разрешения.

В HTML ниже, это вхотвое имя "__RequestVerificationToken" типа "скрытые". Это отправляется на сервер вместе при нажатии кнопки отправки. Кстати, он не придатим методом GET.

На стороне сервера Startup.cs службы. ДобавлениеКонтроллерыПараметры Варианты метода. Фильтры для AutoValidateAntiforgeryToToAttribute, все действия Эта проверка маркеров автоматически добавляется (точнее только методы HTTP POST, PUT, PATCH и DELETE).

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

И наоборот, если вы хотите наложить ограничения на большинство действий, но вы хотите исключить конкретные действия, Если вы установите атрибут IgnoreAntiforgeryToken для контроллера и действия, это нормально.

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews(options =>
  {
    // 全ての「POST, PUT, PATCH, DELETE」アクションに自動で ValidateAntiForgeryToken を付与。
    // 個別に除外したい場合は「IgnoreAntiforgeryToken」属性を指定すること
    // API では HTML 側にトークンを発行できないのでコントローラーに「IgnoreAntiforgeryToken」を指定する必要がある。
    options.Filters.Add(new Microsoft.AspNetCore.Mvc.AutoValidateAntiforgeryTokenAttribute());
  });
}

Давайте посмотрим, как это работает. Прежде всего, процесс передачи осуществляется с экрана в обычном режиме.

Результаты были отражены на экране, как и ожидалось.

Это также выход на след.

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

Доступ ed, но Bad Request был возвращен. Это другой результат, чем когда вы не принимаете меры. Понятно, что он охраняется, потому что это не выход на след.

Сводка

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

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