ASP.NET pyynnön väärentäminen (XSRF/CSRF) -suojaus tässä ytimessä

Sivu päivitetty :
Sivun luontipäivämäärä :

Ympäristö

Visuaalinen studio
  • Visuaalinen studio 2019
ASP.NET Core
  • 3.0
  • 3.1

Mikä on sivustojen välinen pyyntö forgeri?

Sivustojen välinen pyyntöväärennös (CSRF/XSRF) on tarkoitettu niille, joita käsitellään vain kiinnostuksen kohteessa. Hyökkäys haavoittuvuutta vastaan, joka suorittaa tällaisen päivitysprosessin ulkoisesta sivustosta.

Oletetaan esimerkiksi, että sinulla on mahdollisuus julkaista kommentteja verkkosivustolla. Normaalisti, i-kirjain ajatella te jälkisäädös asettaa luona suolitulehdus huomautus polveutua asema, Tätä lähetysprosessia käytetään useimmiten tietojen heittämiseen kohde-URL-osoitteeseen.

Jos siis lähetät url-osoitteeseen vastaavia tietoja joltakin muulta kuin kohdesivustolta, Se on sama herkku, jonka olet lähettänyt.

Jos vain hyökkääjä tekisi näin, se ei olisi uhka. Pelottava asia CSRF on, että hyökkääjät voivat rakentaa väärennettyjä sivustoja tai upottaa piilotettuja URL-osoitteita sivustoon. Siellä joku muu käyttää sitä tahattomasti ja muuttuu hyökkääjäksi.

En mene syvälle täällä, joten ota lisätietoja sivustojen pyynnöstä forgeri.

ASP.NET Core sisällyttää tämän vastatoimen kehykseen.

Tarkista sivustojen välinen pyyntö väärennös toimimaan

Yritä tarkistaa, suoritetaanko päivitysprosessi ulkoisista sivustoista tai työkaluista.

Index.cshtml luo syöttölomakkeen, joka lähettää palvelimelle kirjoittamasi tekstin. Aseta sitten näkymätiedot siten, että palvelin näyttää luomasi viestit, jotka vastaavat syöttötekstiä.

Kävi koulua 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>

Palvelinpuolen HomeController.cs käsittelee lähetetyn tekstin ja tulostaa sen Visual Studion jäljitykseen. Määritä sama teksti ViewData-arvoksi, jotta se voidaan näyttää asiakkaalle.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Yritä suorittaa juuri luomasi toiminnot normaaleissa vaiheissa. Kun suoritat virheenkorjauksen ja näyttöön tulee näyttö, kirjoita teksti ja napsauta Lähetä-painiketta.

Käsitelty teksti näkyy näytössä odotetulla tavalla.

Koska se on myös tuotos jäljittää, visuaalinen studio tulostusikkuna näyttää myös tekstiä. Itse asiassa teemme asioita, kuten syöttämällä syöttötietoja tietokantaan, mutta emme aio yksinkertaistaa koodia täällä.

Yritä nyt käyttää ohjelmaa kohdesivuston ulkopuolelta virheenkorjauksen ja suorittamisen aikana. Ajaksi kansanomaisuus, I-KIRJAIN asettaa asettaa kohteleva koristella vieras Näkö Ateljee Ilmaista koodikielellä. Jos voit lähettää POST, voit käyttää muita työkaluja tai rakentaa toisen sivuston ohjelma hyökkäys.

Kun asennat REST Client -laajennuksen Visual Studio Codeen, Voit käyttää ominaisuutta, jonka avulla voit helposti tarkistaa REST API:n toiminnan avaamalla .http-tiedoston.

Kun luot seuraavankaltaisen .http-tiedoston tekstitiedostoon ja avaat tiedoston Visual Studio Code -muodossa, Voit lähettää GET- tai POST-viestin klikkaamalla lähetä pyyntö.

Jos luot seuraavat POST-tiedot, sinulle lähetetään lähes sama määrä tietoja kuin kirjoitat tekstiä näyttöön ja painat lähetä-painiketta. (Localhost-portin numeron on oltava sama kuin suoritusympäristö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--

Kun lähetät sen, näet, että palvelin vastaanottaa tekstiä ja käsittelee sitä.

Visual Studio Code voi saada tuloksia. Jos tarkastelet tuloskoodia tarkemmin, näet, että ViewData-arvoon asetettu arvo tulee näkyviin. (Se näkyy Unicodessa, mutta teksti näkyy oikein, jos sitä tarkastellaan Web-selaimessa.)

Osoite sivustojen välinen pyyntö forgeri haavoittuvuus

Kuten alussa mainitsin, ASP.NET Core sisältää toimenpiteitä sivustojen välistä väärennöstä vastaan. Yhteinen toimenpide on antaa asiakkaalle yksilöllinen tunnus etukäteen näytöllä, joka vaatii postitse jne. Sinun ei tarvitse hyväksyä käsittelyä, ellet heitä tunnusta palvelimelle.

Tietenkin, jos käytät URL-osoitetta suoraan ulkoisesta sivustosta, tunnus on tuntematon eikä hyväksy käsittelyä.

Ensinnäkin haluaisin puhua antaa rahakkeita asiakkaalle (HTML), mutta tosiasia on, että kehys ei pysty tekemään tätä. Se lähtee. Jos määrität POST-menetelmän lomaketunnisteessa, voit sisällyttää tunnusparametrit HTML-koodiin ilman lupaa.

Html alla, se on syötteen nimi = "__RequestVerificationToken" type = "piilotettu". Tämä lähetetään palvelimeen yhdessä, kun lähetyspainiketta painetaan. Muuten, se ei ole liitettävä GET menetelmä.

Palvelimen puolella, Startup.cs palveluja. AddControllersWithViews-menetelmän asetukset. Suodattimet, jotka AutoValidateAntiforgeryTokenAttribute, kaikki toiminnot Tämä tunnustarkistus lisätään automaattisesti (on tarkka vain POST-, PUT-, PATCH- ja DELETE-protokollan HTTP-menetelmistä).

Jos haluat lisätä tämän rajoituksen vain tiettyihin toimintoihin, ei kaikkiin toimintoihin, jotka on ohjattu On myös mahdollista asettaa.

Jos taas haluat asettaa rajoituksia useimmille toiminnoille, mutta haluat sulkea pois tiettyjä toimia, Jos määrität IgnoreAntiforgeryToken-määritteen ohjaimelle ja toiminnolle, se 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());
  });
}

Katsotaan, miten se toimii. Ensinnäkin, siirto prosessi tehdään näytön normaalisti.

Tulokset näkyivät ruudulla odotetusti.

Se on myös tuotos jäljittää.

Yritetään päästä käsiksi ulkoa.

Käyttö, mutta virheellinen pyyntö palautettiin. Se on eri tulos kuin silloin, kun et ryhdy toimenpiteisiin. On selvää, että se on vartioitu, koska se ei ole tuotos jäljittää.

Yhteenveto

Tällä kertaa olen yrittänyt toteuttaa toimenpiteitä vastaan sivustojen välinen pyyntö forgeri. Se oli erittäin helppo toteuttaa, koska se oli jo rakennettu kehykseen.

Web-sivuston rakentaminen vaatii paljon enemmän haavoittuvuutta kuin CSRF. Voit tarkistaa, mitä siellä on, tai voit käyttää työkaluja, kuten OWASP tarkistaa haavoittuvuuksia sivustossasi.