ASP.NET підробок запитів (XSRF /CSRF) у цьому ядрі

Сторінка оновлюється :
Дата створення сторінки :

Середовищі

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 3,0
  • 3,1

Що таке крос-сайтових запит forgeri?

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

Наприклад, припустимо, що у вас є можливість залишати коментарі на веб-сайті. Як правило, я думаю, ви будете розміщувати, ввівши коментар з сайту, Цей процес надсилання найчастіше використовується для метання даних за цільовою URL-адресою.

Таким чином, якщо ви надсилаєте подібні дані до URL-адреси іншого користувача, окрім цільового сайту, Це ж лікувати ви Написав.

Якщо тільки зловмисник б це зробити, це не буде загрозою. Страшні речі про CSRF є те, що зловмисники можуть створювати підроблені сайти або вставляти приховані URL на сайті. Це де інший ненавмисно звертається до нього і стає зловмисником.

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

ASP.NET Core включає в себе цю контрзаходи в рамках.

Перевірка міжсайтових запитів підробки на роботу

Спробуйте побачити, якщо процес оновлення фактично виконується з зовнішніх сайтів або інструментів.

Index. cshtml створює форму вводу, що надсилає введений до сервера текст. Потім помістіть viewdata так, що сервер відображає повідомлення, які ви створили, щоб відповідати введенному тексту.

Index. 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 виводу вікно також відображає текст. Насправді, ми робимо такі речі, як реєстрація вхідних даних у базі даних, але ми не збираємося спростити код тут.

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

Під час інсталяції розширення, званий Rest клієнта в Visual Studio код, Ви можете використовувати функцію, яка дозволяє легко перевірити роботу REST API, просто відкривши файл. http.

Під час створення http-файл, подібний до такого в текстовому файлі та відкрийте файл у Visual Studio коду, Ви можете відправити GET або POST, натиснувши надіслати запит.

Якщо ви створюєте такі дані POST, вам буде надіслано майже однакову кількість даних під час введення тексту на екрані та натиснути кнопку Надіслати. (Локальний номер порту має бути таким самим, як і середовище виконання.)

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

Коли ви надсилаєте його, ви можете побачити, що сервер отримує текст і обробляє його.

Visual Studio-код може отримати результати. Якщо придивитися до коду результату, можна побачити, що відображається значення для ViewData. (Він відображається в кодуванні Юнікод, але текст відображається правильно, якщо його переглядати у браузері.)

Адреса крос-сайт запит forgeri вразливості

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

Звичайно, якщо ви отримаєте доступ до URL безпосередньо з зовнішнього сайту, маркер невідомий і не прийме обробку.

По-перше, я хотів би поговорити про видачу токенів клієнту (HTML), але справа в тому, що рамки не в змозі це зробити. Піде. Якщо ви вкажете метод POST у тегу форми, ви можете включити параметри маркера в HTML без дозволу.

У HTML нижче, це ім'я вхідного = "__RequestVerificationToken" тип = "прихований". Це надсилається на сервер разом, під час натискання кнопки "Надіслати". До речі, він не додається методом GET.

На стороні сервера, Startup.cs послуги. AddControllersWithViews варіанти методу. Фільтрів для Автомаркування атрибут, усі дії Цей маркер перевірки автоматично додається до (бути точним тільки HTTP методи пост, ПОКЛАСТИ, ПАТЧ, і видалити).

Якщо ви хочете додати це обмеження лише до певних дій, не всі дії, на контролер, за дію Також можна встановити.

І навпаки, якщо ви хочете накласти обмеження на більшість дій, але ви хочете виключити певні дії, Якщо встановити атрибут " незнання " до контролера та дії, це нормально.

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());
  });
}

Давайте подивимося, як це працює. Перш за все, процес передачі здійснюється з екрану нормально.

Результати були відображені на екрані, як очікувалося.

Це також вихід до сліду.

Тепер Давайте спробуємо отримати доступ до нього ззовні.

Доступ Ед, але поганий запит був повернутий. Це інший результат, ніж коли ви не приймаєте заходів. Зрозуміло, що вона охороняється, оскільки вона не виводиться на трасування.

Резюме

На цей раз я спробував реалізувати заходи проти крос-сайтових запитів forgeri. Це було дуже легко реалізувати, тому що вона вже була побудована в рамках.

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