ASP.NET (XSRF/CSRF) v tomto základnom

Stránka aktualizovaná :
Dátum vytvorenia strany :

Životné prostredie

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

Čo je to cross-site žiadosť forgeri?

Krížová požiadavka falšovanie (CSRF/XSRF) je pre tie, ktoré sú spracované iba v rámci stránky záujmu. Útok na chybu, ktorá vykonáva takýto proces aktualizácie z externého webu.

Predpokladajme napríklad, že máte možnosť písať komentáre na webovej lokalite. Normálne, myslím, že budete post zadaním komentár z webu, Tento proces odosielania sa najčastejšie používa na hádzanie údajov na cieľovej adrese URL.

Preto, ak odošlete podobné údaje na adresu URL od niekoho iného ako cieľová lokalita, Je to rovnaké liečiť ste vyslaný.

Keby len útočník by to, že by nebolo hrozbou. Desivá vec, o CSRF je, že útočníci môžu stavať falošné stránky alebo vložiť skryté adresy URL v mieste. Je to miesto, kde niekto iný neúmyselne pristupuje a stane sa útočníkom.

Nebudem ísť do hĺbky tu, tak prosím dozvedieť sa viac o cross-site žiadosť forgeri.

ASP.NET Core zahŕňa toto protiopatrenia do rámca.

Skontrolujte, či cross-site žiadosti o falšovanie do práce

Pokúste sa zistiť, či je proces aktualizácie skutočne vykonaný z externých lokalít alebo nástrojov.

Index. cshtml vytvorí vstupný formulár, ktorý odosiela text, ktorý ste zadali na server. Potom umiestnite pripojenie tak, že server zobrazí správy, ktoré ste vytvorili, aby zodpovedali vstupný text.

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>

Server-bočné HomeController.cs spracováva odoslaný text a výstupy na Visual Studio sledovania. Nastavte rovnaký text na ViewData tak, aby mohol byť zobrazený na klienta.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Pokúste sa vykonať funkčnosť, ktorú ste práve vytvorili v bežných krokoch. Keď spustíte ladenie a zobrazí sa obrazovka, zadajte text a kliknite na tlačidlo Odoslať.

Spracovaný text sa zobrazí na obrazovke podľa očakávania.

Pretože je tiež výstup na stopku, Visual Studio výstup okno tiež zobrazuje text. V skutočnosti robíme veci, ako je registrácia vstupných dát v databáze, ale nebudeme zjednodušiť kód tu.

Teraz sa pokúste získať prístup k programu z mimo cieľovej stránky pri ladení a behu. Pre jednoduchosť, budem post post pomocou nástroja s názvom Visual Studio kód. Ak môžete posielať poštou, môžete použiť iné nástroje alebo vytvoriť iný program pre útok.

Pri inštalácii rozšírenie s názvom Rest client v Visual Studio kód, Môžete použiť funkciu, ktorá vám umožní ľahko skontrolovať prevádzku REST API jednoduchým otvorením súboru. http.

Pri vytváraní súboru. http podobné nasledovnému v textovom súbore a potom otvorte súbor v Visual Studio kód, Môžete poslať GET alebo POST kliknutím na tlačidlo Odoslať žiadosť.

Ak vytvoríte nasledujúce POST údaje, budete odoslaná takmer rovnaké množstvo údajov pri písaní textu na obrazovke a stlačte tlačidlo Odoslať. (Číslo portu localhost by malo byť rovnaké ako spustenie prostredia.)

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

Keď ho odošlete, môžete vidieť, že server prijíma text a spracováva ho.

Visual Studio kód môže získať výsledky. Ak ste sa bližšie pozrieť na výsledok kód, môžete vidieť, že hodnota nastavená pre ViewData sa zobrazí. (Je zobrazený v Unicode, ale text sa zobrazí správne, ak je zobrazený vo webovom prehľadávači.)

Adresa cross-site žiadosť forgeri zraniteľnosť

Ako som sa už zmienil na začiatku, ASP.NET Core zahŕňa opatrenia proti falšovaniu v rámci stránky. Spoločným opatrením je vydať jedinečný token klientovi vopred na obrazovke, ktorá vyžaduje post, atď. Nemusíte akceptovať spracovanie, ak ste hádzať token na server.

Samozrejme, ak máte prístup k URL priamo z externého webu, token je neznámy a nebude akceptovať spracovanie.

Po prvé, chcel by som hovoriť o vydávaní žetónov klientovi (HTML), ale faktom je, že rámec nie je schopný to urobiť. Pôjde. Ak určíte metódu POST vo formulári tag, môžete do HTML bez povolenia začleniť parametre tokenu.

V HTML nižšie, je vstupné meno = "__RequestVerificationToken" typ = "skrytý". To sa odošle na server spolu, keď je stlačené tlačidlo Odoslať. Mimochodom, nie je pripojená metódou GET.

Na strane servera, Startup.cs služby. AddControllersWithViews možnosti metódy. Filtre na Autovalidateantiforgerytokenattribute, všetky akcie Táto kontrola tokenu je automaticky pridaný do (byť presný iba HTTP metódy POST, PUT, PATCH a DELETE).

Ak chcete pridať toto obmedzenie len na konkrétne akcie, nie všetky akcie, na kontrolóra, na akciu Je tiež možné nastaviť.

Naopak, ak chcete uložiť obmedzenia pre väčšinu akcií, ale chcete vylúčiť konkrétne akcie, Ak nastavíte atribút Ignoreantiforgerytoken radič a akciu, je to 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());
  });
}

Pozrime sa, ako to funguje. Po prvé, proces prenosu sa vykonáva z obrazovky normálne.

Výsledky sa odrazili na obrazovke, ako sa očakávalo.

To je tiež výstup na stopku.

Teraz, poďme sa pokúsiť o prístup k nej zvonku.

Prístup Ed, ale Nesprávna požiadavka bola vrátená. Je to iný výsledok, ako keď nie ste s opatreniami. Je zrejmé, že je strážené, pretože to nie je výstup na stopku.

Zhrnutie

Tentoraz som sa snažil implementovať opatrenia proti cross-site žiadosť forgeri. Bolo to veľmi jednoduché realizovať, pretože to bolo už postavené do rámca.

Budovanie webovej stránky vyžaduje oveľa viac zraniteľnosti ako CSRF. Môžete skontrolovať, čo je vonku, alebo môžete použiť nástroje, ako je OWASP pre kontrolu zraniteľnosti na vašich stránkach.