ASP.NET V tomto jádru je ochrana před paděláním požadavků (XSRF/CSRF)

Stránky aktualizovány :
Datum vytvoření stránky :

Prostředí

Visual Studio
  • Visual Studio 2019
ASP.NET jádro
  • 3.0
  • 3.1

Co je to padělání žádostí mezi lokalitami?

Padělání požadavků na příčné stránky (CSRF/XSRF) je pro ty, které jsou zpracovávány pouze v rámci zajímavého místa. Útok na chybu zabezpečení, která provádí takový proces aktualizace z externího webu.

Předpokládejme například, že máte možnost psát komentáře na webu. Za normálních okolností, myslím, že budete post zadáním komentář z webu, Tento proces odesílání se nejčastěji používá k vyvolání dat na cílovou adresu URL.

Pokud tedy na adresu URL odešlete podobná data od jiného uživatele než cílového webu, Je to stejné zacházení, které jste zveřejnil.

Kdyby to udělal útočník, nebyla by to hrozba. Děsivá věc, o CSRF je, že útočníci mohou stavět falešné stránky nebo vložit skryté adresy URL na webu. Je to místo, kde někdo jiný neúmyslně přistupuje k němu a stane se útočníkem.

Nebudu jít do hloubky zde, tak prosím dozvědět se více o cross-site žádosti padělky.

ASP.NET Core toto protiopatření začleňuje do rámce.

Kontrola padělání požadavků na příčky webu

Pokuste se zjistit, zda je proces aktualizace skutečně proveden z externích webů nebo nástrojů.

Index.cshtml vytvoří vstupní formulář, který odešle zadaný text na server. Potom umístěte data zobrazení tak, aby server zobrazoval zprávy, které jste vytvořili tak, aby odpovídaly vstupnímu textu.

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 na straně serveru zpracuje odeslaný text a vypíše jej do trasování sady Visual Studio. Nastavte stejný text na ViewData tak, aby jej lze zobrazit klientovi.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Pokuste se provést funkce, které jste právě vytvořili v normálních krocích. Po spuštění ladění a zobrazí se obrazovka, zadejte text a klepněte na tlačítko Odeslat.

Zpracovaný text se zobrazí na obrazovce podle očekávání.

Vzhledem k tomu, že je také výstup trasování, vizuální studio výstupní okno také zobrazí text. Ve skutečnosti děláme věci, jako je registrace vstupních dat v databázi, ale nebudeme zjednodušit kód zde.

Nyní se pokuste o přístup k programu mimo cílový web při ladění a spuštění. Pro jednoduchost, budu post post pomocí nástroje s názvem Visual Studio kód. Pokud můžete odeslat POST, můžete použít jiné nástroje nebo vytvořit jiný program webu pro útok.

Při instalaci rozšíření s názvem KLIENT REST v kódu sady Visual Studio Můžete použít funkci, která umožňuje snadno zkontrolovat provoz rozhraní REST API pouhým otevřením souboru .http.

Když v textovém souboru vytvoříte soubor HTTP podobný následujícímu a potom soubor otevřete v kódu sady Visual Studio, Můžete poslat GET nebo POST kliknutím na odeslat požadavek.

Pokud vytvoříte následující data POST, budete odesláni téměř stejné množství dat jako text na obrazovce a stiskněte tlačítko odeslat. (Číslo portu Localhost by mělo být stejné jako prostředí spuštění.)

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

Když jej odešlete, uvidíte, že server přijímá text a zpracovává jej.

Visual Studio Code můžete získat výsledky. Pokud se blíže podíváte na kód výsledku, uvidíte, že je zobrazena hodnota nastavená pro ViewData. (Zobrazuje se v kódování Unicode, ale při zobrazení ve webovém prohlížeči se text zobrazí správně.)

Chyba zabezpečení týkající se adres mezi servery

Jak jsem již zmínil na začátku, ASP.NET Core zahrnuje opatření proti padělání žádostí mezi lokalitami v rámci. Společným opatřením je vydat klientovi předem jedinečný token na obrazovce, která vyžaduje příspěvek atd. Není třeba přijmout zpracování, pokud nehodíte token na server.

Samozřejmě, pokud přistupujete k adrese URL přímo z externího webu, token je neznámý a nebude přijímat zpracování.

Za prvé, chtěl bych mluvit o vydávání tokenů klientovi (HTML), ale faktem je, že rámec není schopen to udělat. Půjde. Pokud zadáte metodu POST ve značce formuláře, můžete parametry tokenu začlenit do kódu HTML bez oprávnění.

V níže uvedeném HTML je to vstupní name="__RequestVerificationToken" type="hidden". To je odeslána na server společně při stisknutí tlačítka odeslat. Mimochodem, není připojen metodou GET.

Na straně serveru Startup.cs služby. AddControllersWithViews možnosti metody. Filtry pro AutoValidateAntiforgeryTokenAttribute, všechny akce Tato kontrola tokenu je automaticky přidána do (přesněji řečeno pouze metody HTTP POST, PUT, PATCH a DELETE).

Pokud chcete přidat toto omezení pouze pro určité akce, ne všechny akce na řadič, na akci Je také možné nastavit.

Naopak, pokud chcete uvalit omezení na většinu akcí, ale chcete vyloučit konkrétní akce, Pokud nastavíte IgnoreAntiforgeryToken atribut řadič a akce, je ok.

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

Uvidíme, jak to bude fungovat. Za prvé, proces přenosu se provádí z obrazovky normálně.

Výsledky se odrazily na obrazovce podle očekávání.

Je také výstup do trasování.

Teď se k tomu pokusíme dostat zvenku.

Přístup ed, ale byl vrácen chybný požadavek. Je to jiný výsledek, než když nepřijímáte opatření. Rozumí se, že je střežen, protože není výstup do trasování.

Shrnutí

Tentokrát jsem se snažil zavést opatření proti cross-site žádosti padělky. Bylo velmi snadné ji implementovat, protože byla již zabudována do rámce.

Vytvoření webu vyžaduje mnohem větší zranitelnost než csrf. Můžete zkontrolovat, co je tam venku, nebo můžete použít nástroje, jako je OWASP, abyste zkontrolovali chyby zabezpečení na vašem webu.