ASP.NET Zahtevajte zaščito pred ponarejenjem (XSRF/CSRF) v tem jedru

Stran posodobljena :
Datum ustvarjanja strani :

Okolje

Vizualni Studio
  • Vizualni Studio 2019
ASP.NET jedro
  • 3,0
  • 3,1

Kaj je prošnja za navzkrižno spletno stran forgeri?

Ponarejanje zahtevkov za navzkrižno spletno mesto (CSRF/XSRF) je za tiste, ki se obdelujejo samo znotraj mesta zanimanja. Napad na ranljivost, ki izvede tak postopek posodabljanja z zunanjega spletnega mesta.

Denimo, da imate možnost objave komentarjev na spletnem mestu. Običajno, mislim, da boste objavili tako, da vnesete komentar iz spletne strani, Ta postopek pošiljanja se najpogosteje uporablja za metanja podatkov na ciljni URL.

Če torej pošiljate podobne podatke URL-ju od osebe, ki ni ciljna stran, To je isto zdravljenje ste napoteni.

Če bi le napadalec to storil, to ne bi bila grožnja. Strašen državni zbor ali ljudska skupšeina približno CSRF je to napadalci moči zidava sleparstvo položaj ali vlagati skriven URLs v položaj. To je, če nekdo drug nenamerno dostopa do njega in postane napadalec.

Ne bom šel v globino tukaj, zato vas prosimo, izvedeli več o Cross-Site zahtevo forgeri.

ASP.NET Core vključuje ta protiukrep v okvir.

Preverite zahtevo za ponarejanje na več straneh za delo

Poskusite videti, ali je postopek posodabljanja dejansko izveden iz zunanjih spletnih mest ali orodij.

Index. cshtml ustvari vhodni obrazec, ki pošlje besedilo, ki ste ga vnesli v strežnik. Nato postavite Viewdata tako, da strežnik prikaže sporočila, ki ste jih ustvarili, da se ujemajo z vhodnim besedilom.

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-Side HomeController.cs obdeluje poslano besedilo in ga izhodi v Visual Studio sled. Nastavite isto besedilo na ViewData, tako da ga lahko prikažete odjemalcu.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Poskusite izvesti funkcionalnost, ki ste jo pravkar ustvarili v običajnih korakih. Ko zaženete razhroščevanje in se prikaže zaslon, vnesite besedilo in kliknite na Pošlji gumb.

Obdelano besedilo se prikaže na zaslonu, kot je bilo pričakovano.

Ker je tudi izhod na sled, vizualni Studio izhodno okno prikaže tudi besedilo. Pravzaprav delamo stvari, kot so registriranje vhodnih podatkov v zbirki podatkov, vendar ne bomo poenostavili kode tukaj.

Zdaj, začeti v postranski disciplinski nadzornik v Oxfordu ali Cambridgeu izven tarča položaj prebiti debugging ter tekmovanje v teku. Za preprostost, bom post post z orodjem, imenovanim Visual Studio code. Če lahko pošljete POST, lahko uporabite druga orodja ali graditi drugo mesto program za napad.

Ko namestite pripono, imenovano REST Client v Visual Studio Code, Lahko uporabite funkcijo, ki vam omogoča enostavno preverjanje delovanja REST API samo z odpiranjem. http datoteko.

Ko ustvarite datoteko. http, podobno naslednjima v besedilni datoteki, in nato odprite datoteko v kodi Visual Studio, GET ali POST lahko pošljete tako, da kliknete Pošlji zahtevo.

Če ustvarite naslednje podatke POST, boste poslali skoraj enako količino podatkov med vnosom besedila na zaslonu in pritisnite gumb Pošlji. (Localhost luka števnik should obstati isto kot usmrtitev okolje.)

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

Ko ga pošljete, lahko vidite, da strežnik prejema besedilo in ga obdeluje.

Visual Studio Code lahko dobite rezultate. Če ste vzeli podrobnejši pogled na kodo rezultata, lahko vidite, da je nastavljena vrednost za ViewData prikazana. (Prikaže se v Unicode, besedilo pa se prikaže pravilno, če si ga ogledate v spletnem brskalniku.)

Naslov zahteve za navzkrižno spletno mesto forgeri ranljivost

Kot sem že omenil na začetku, ASP.NET Core vključuje ukrepe proti zahtevku za ponarejanje čez mesto v okviru. Skupni ukrep je, da stranki vnaprej izda edinstven žeton na zaslonu, ki zahteva objavo itd. Obdelave ni treba sprejeti, če žeton ne vržete v strežnik.

Seveda, če dostopate do URL-ja neposredno z zunanjega spletnega mesta, žeton ni znan in ne bo sprejel obdelave.

Najprej bi rad govoril o izdajanju žetonov stranki (HTML), vendar dejstvo je, da okvir ne more storiti tega. Bo že šlo. Če v oznaki obrazca podate metodo POST, lahko parametre žetona vključite v HTML brez dovoljenja.

V spodnjem HTML-ju je vnosno ime = "__RequestVerificationToken" Type = "skrito". To se pošlje strežniku skupaj, ko pritisnete gumb za pošiljanje. Mimogrede, ni priložena metoda GET.

Na strani strežnika, Startup.cs storitve. AddControllersWithViews predkupna pravica metoda. Filtri za Autovalidateantiforgerytokenattribute, vsa dejanja To preverjanje žetona se samodejno doda (da je natančno samo metode HTTP za POST, PUT, PATCH in DELETE).

Če želite to omejitev dodati le določenim dejanjem, ne vsi ukrepi, na krmilnik, na dejanje Prav tako je mogoče nastaviti.

Nasprotno pa, če želite vsiliti omejitve za večino dejanj, vendar želite izključiti določena dejanja, Če nastavite atribut Ignoreantiforgerytoken na krmilnik in dejanje, je v redu.

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

Poglejmo, kako deluje. Najprej, postopek prenosa se opravi z zaslona normalno.

Rezultati so se odražali na zaslonu, kot je bilo pričakovano.

Prav tako je izhod na sled.

Zdaj pa poskusimo dostopati od zunaj.

Dostop ED, ampak Bad Request je bil vrnjen. To je drugačen rezultat kot takrat, ko ne jemlješ ukrepov. Razume se, da je varovano, ker ni izhod na sled.

Povzetek

Tokrat sem poskušal izvajati ukrepe proti Cross-Site zahtevo forgeri. Bilo je zelo enostavno izvajati, ker je bil že vgrajen v okvir.

Gradnja spletne strani zahteva veliko več ranljivosti kot CSRF. Vi moči ček kakšen ' tam zunaj, ali vi moči raba rokodelsko orodje všeč biti OWASP v ček zakaj ranljivost v vaš položaj.