ASP.NET taotlus võltsimise (XSRF/CSRF) kaitse selles tuumas

Lehekülg uuendatud :
Lehe loomise kuupäev :

Keskkond

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

Mis on saitidevahelise taotluse forgeri?

Saitidevahelise taotluse võltsimine (CSRF/XSRF) on need, mida töödeldakse ainult Huvipakkuva koha piires. Haavatavuse, mis teeb sellise värskenduse protsessi välise saidi rünnak.

Oletame näiteks, et teil on võimalus postitada kommentaare veebilehel. Tavaliselt, ma arvan, et te postitate sisestades kommentaar saidilt, Seda saatmisprotsessi kasutatakse enamasti sihturl-i andmete viskamisprotsessis.

Seetõttu, kui saadate sarnaseid andmeid URL-i keegi muu kui Target saidi, See on sama, mida sa postitasid.

Kui ainult ründaja teeks seda, see ei oleks oht. Hirmutav asi CSRF on see, et ründajad suudavad ehitada võltsitud saidid või kinnistada peidetud URL-id kohapeal. See on koht, kus keegi teine seda tahtmatult pöördub ja saab ründaja.

Ma ei lähe sügavusele, nii et palun lugege lisateavet saitidevahelise taotluse forgeri kohta.

ASP.NET Core kaasab selle vastumeetme raamistikku.

Kontrollige saitidevahelise taotluse võltsimine töötamiseks

Proovige näha, kas Värskendusprotsess on tegelikult tehtud välised saidid või tööriistad.

Index. cshtml loob sisestusvormi, mis saadab serverisse sisestatud teksti. Seejärel paigutage vaadandmed nii, et server kuvaks sisendtekstile vastavaks loodud sõnumeid.

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>

Serveripoolne HomeController.cs töötleb saadetud teksti ja väljund see Visual Studio jälg. Seadke sama tekst ViewData, et seda saaks kuvada kliendile.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Proovige sooritada funktsioone, mis on äsja loodud tavalistes sammudega. Kui käivitate silumise ja kuvatakse ekraan, sisestage tekst ja klõpsake nuppu Edasta.

Töödeldud tekst kuvatakse ekraanil ootuspäraselt.

Kuna see on ka väljund jälg, Visual Studio väljund aken kuvatakse ka teksti. Tegelikult teeme selliseid asju nagu sisendandmete registreerimine andmebaasis, kuid me ei kavatse koodi siin lihtsustada.

Nüüd proovige pääseda programmi väljastpoolt sihtsaiti silumise ja töötamise ajal. Lihtsuse puhul postitan postituse, kasutades tööriista nimega Visual Studio Code. Kui saate saata POST, saate kasutada muid tööriistu või ehitada teise saidi programmi rünnaku.

Laiendus nimetatakse ülejäänud kliendi Visual Studio koodi installimisel Saate kasutada funktsiooni, mis võimaldab teil hõlpsasti kontrollida ülejäänud API toimimist lihtsalt avades http-faili.

Kui loote http-faili, mis sarnaneb järgmisega tekstifailis ja avage fail Visual Studio Code, Saate saata GET või POST klõpsates saada taotluse.

Kui loote järgmised POST-andmed, saadetakse teile ekraanil teksti tippega peaaegu sama hulk andmeid ja vajutage nuppu Edasta. (Localhost pordi number peaks olema sama, mis täitmise keskkonnas.)

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

Kui te selle saadate, näete, et server saab teksti ja töötleb seda.

Visual Studio kood võib saada tulemusi. Kui vaatate tulemusetähist lähemalt, näete, et kuvatakse ViewData-väärtuste kogum. (See kuvatakse Unicode ' i, kuid tekst kuvatakse õigesti, kui vaadata veebibrauseris.)

Aadress saitidevahelise taotluse forgeri haavatavuse

Nagu ma mainisin alguses, ASP.NET Core sisaldab meetmeid saitidevahelise taotluse võltsimine raamistikus. Ühine meede on anda kliendile kordumatu luba eelnevalt ekraanile, mis nõuab postitust jne. Te ei pea aktsepteerima töötlemist, kui te ei viska luba serverisse.

Muidugi, kui pääsete URL-i otse välise saidi, luba on tundmatu ja ei aktsepteeri töötlemine.

Esiteks Sooviksin rääkida väljastamisega kliendi (HTML), kuid fakt on see, et raamistik ei saa seda teha. Läheb lahti. Kui määrate vormi silt POST-meetodi, saate lisada loa parameetrid HTML ilma loata.

Allpool HTML-i on sisendi nimi = "__RequestVerificationToken" Type = "peidetud". See saadetakse serverisse koos saada nuppu vajutamisel. Muide, see ei ole lisatud GET meetod.

Serveripoolne, Startup.cs teenused. AddControllersWithViews meetod võimalusi. Filtrid Autovalidateantiforgerytokenattribute, kõik toimingud See luba kontroll lisatakse automaatselt (et olla täpne ainult HTTP-meetodid POST, PUT, PATCH ja DELETE).

Kui soovite selle piirangu lisada ainult konkreetsetele tegevustele, mitte kõigile toiminguile, iga vastutava töötleja kohta Samuti on võimalik määrata.

Seevastu, kui soovite kehtestada piirangud enamikule toimingutele, kuid soovite välistada teatud tegevused, Kui seate Ignoreantiforgerytoken atribuut kontroller ja toiming, see on 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());
  });
}

Vaatame, kuidas see töötab. Esiteks, edastamise protsess toimub ekraani normaalselt.

Tulemused kajastati ekraanil ootuspäraselt.

See on ka väljund jälg.

Proovime sellest väljast pääseda.

Juurdepääs, kuid vigane päring on tagastatud. See on teistsugune tulemus kui siis, kui sa ei võta meetmeid. On arusaadav, et seda valvatakse, sest see ei ole väljund jälg.

Kokkuvõte

Seekord Üritasin rakendada meetmeid saitidevahelise taotluse forgeri vastu. See oli väga lihtne rakendada, sest see oli juba loodud raamistikku.

Veebisaidi loomine nõuab palju haavatavust kui CSRF. Saate kontrollida, mis seal on, või saate kasutada tööriistu nagu OWASP kontrollida haavatavused saidile.