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

Страницата се актуализира :
Дата на създаване на страница :

Околната среда

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

Какво е заявка за кръстосана страница подправяне?

Заявка за заявка за кръстосана площадка (CSRF/XSRF) е за тези, които се обработват само в рамките на сайта, който представлява интерес. Атака на уязвимост, която извършва такъв процес на актуализация от външен сайт.

Да предположим например, че имате възможността да публикувате коментари на уеб сайт. Обикновено, мисля, че ще публикувате, като въведете коментар от сайта, Този процес на изпращане най-често се използва за хвърляне на данни в целевия URL адрес.

Следователно, ако изпращате подобни данни към URL адреса от някой, различен от целевия сайт, Същото е и за теб.

Ако само един нападател би направил това, това няма да е заплаха. Страшното нещо за CSRF е, че нападателите могат да изградят фалшиви сайтове или да вградят скрити URL адреси в сайта. Това е мястото, където някой друг неволно го е допринесл и става нападател.

Няма да се впусна в дълбочина тук, така че, моля, научете повече за заявката за кръстосана заявка за сайт forgeri.

ASP.NET Ядро то включва тази противодействие в рамката.

Проверка на заявката за кръстосана проверка на заявката за проверка на работа

Опитайте се да видите дали процесът на актуализация всъщност се извършва от външни сайтове или инструменти.

Index.cshtml създава входен формуляр, който изпраща въведения от вас текст към сървъра. След това поставете viewdata, така че сървърът да показва съобщения, които сте създали, за да съответстват на входния текст.

Индекс на

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

  // 省略
}

Опитайте се да изпълните функционалността, която току-що създадохте в нормалните стъпки. Когато стартирате отстраняване на грешки и се появи екранът, въведете текста и щракнете върху бутона Подаване.

Обработеният текст се появява на екрана, както се очаква.

Тъй като е изходна таза, визуална studio изход прозорец също показва текст. Всъщност, ние правим неща като регистриране на входни данни в база данни, но ние няма да опрости кода тук.

Сега, опитайте да получите достъп до програмата извън целевия сайт, докато грешки тече и работи. За простота ще публикувам публикация с помощта на инструмент, наречен Visual Studio Code. Ако можете да изпратите POST, можете да използвате други инструменти или да създадете друга програма за сайта за атаката.

Когато инсталирате разширение, наречено REST клиент в Visual Studio Код, Можете да използвате функция, която ви позволява лесно да проверите работата на REST API само чрез отваряне на .http файла.

Когато създавате .http файл, подобен на следния в текстов файл и след това отворете файла в Visual Studio Код, Можете да изпратите GET или POST, като кликнете върху изпращане на заявка.

Ако създадете следните данни POST, ще ви бъдат изпратени почти същото количество данни, като въвеждате текст на екрана и натиснете бутона за подаване. (Localhost порт номер трябва да бъде същата като среда за изпълнение.)

Превод и теасто

### 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 се показва. (Той се показва в Unicode, но текстът се показва правилно, ако се гледа в уеб браузър.)

Адрес заявка за кръстосана основа подправена уязвимост

Както споменах в началото, ASP.NET Core включва мерки срещу искане за кръстосана площадка в рамката. Обща мярка е предварително да се издаде уникален маркер на клиента на екран, който изисква публикация и т.н. Не е нужно да приемате обработка, освен ако не хвърли маркера на сървъра.

Разбира се, ако влезете в URL адреса директно от външен сайт, токенът е неизвестен и няма да приема обработка.

Първо, бих искал да говоря за издаването на жетони на клиента (HTML), но факт е, че рамката не е в състояние да направи това. Ще си тръгна. Ако зададете метод POST в маркера на формуляра, можете да включите маркери теза таки в HTML без разрешение.

В HTML по-долу, това е входното име = "__RequestVerificationToken" тип = "скрит". Това се изпраща на сървъра заедно, когато е натиснат бутона за изпращане. Между другото, тя не е приложена от метода GET.

От страна на сървъра Startup.cs услуги. AddControllersСПоказва опции за метода. Филтри към AutoValidateAntiforgeryTokenАтрибут, всички действия Тази проверка на маркера се добавя автоматично (да бъде точен само HTTP методите на POST, ПОСТАВИ, КРЪП, и ИЗТРИВАНЕ).

Ако искате да добавите това ограничение само към конкретни действия, не всички действия, за всеки контролер, за действие Също така е възможно да се зададе.

И обратно, ако искате да наложите ограничения на повечето действия, но искате да Ако зададете 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());
  });
}

Да видим как ще стане. На първо място, предаването се извършва от екрана нормално.

Резултатите са отразени на екрана, както се очаква.

Също така е изход на следата.

Сега, нека се опитаме да го получите отвън.

Достъп до ед. Това е различен резултат, отколкото когато не взимате мерки. Разбираемо е, че тя се охранява, защото не е изход на следата.

Резюме

Този път се опитах да внеса мерки срещу заявка за кръстосана площадка forgeri. Беше много лесно да се приложи, защото вече е вграден в рамката.

Изграждането на уеб сайт изисква много повече уязвимост от CSRF. Можете да проверите какво има там или да използвате инструменти като OWASP, за да проверите за уязвимости в сайта си.