ASP.NET užklausos klastojimo (XSRF/CSRF) apsauga šiame branduolyje

Puslapis atnaujintas :
Puslapio sukūrimo data :

Aplinkos

Visual Studija
  • "Visual Studio 2019"
ASP.NET branduolys
  • 3.0
  • 3.1

Kas yra kelių svetainių užklausa klastotos?

Kelių svetainių užklausų klastojimas (CSRF/XSRF) skirtas tiems, kurie apdorojami tik dominančioje vietoje. Pažeidžiamumas, kuris atlieka tokį naujinimo procesą iš išorinės svetainės ataka.

Pavyzdžiui, tarkime, kad turite galimybę skelbti komentarus svetainėje. Paprastai, manau, kad jums bus po įvesdami komentarą iš svetainės, Šis siuntimo procesas dažniausiai naudojamas duomenims mesti į paskirties URL.

Todėl, jei panašius duomenis siunčiate į URL iš kito asmens nei paskirties svetainė, Tai tas pats gydyti jums paskelbtas.

Jei tik užpuolikas tai padarytų, tai nebūtų grėsmė. Baisu skandinti apie CSRF yra tai, kad užpuolikai gali kurti suklastotas svetaines arba įdėti paslėptus URL į svetainę. Tai kur kažkas netyčia prisijungia prie jo ir tampa užpuolikas.

I won't go į gylį čia, todėl prašome sužinoti daugiau apie kelių svetainių prašymą klastotės.

ASP.NET Branduolys įtraukia šią atsakomąją priemonę į sistemą.

Tikrinti kelių svetainių užklausos klastojimą darbui

Pabandykite patikrinti, ar naujinimo procesas iš tikrųjų atliekamas iš išorinių svetainių ar įrankių.

Index.cshtml sukuria įvesties formą, kuri siunčia į serverį įvestą tekstą. Tada įdėkite viewdata taip, kad serveris rodytų pranešimus, kuriuos sukūrėte, kad atitiktų įvesties tekstą.

Index.cshtml (Indeksas.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>

Serverio HomeController.cs apdoroja išsiųstą tekstą ir išveda jį į Visual Studio sekimo. Nustatykite tą patį tekstą kaip ViewData, kad jį būtų galima rodyti klientui.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Pabandykite atlikti funkciją, kurią ką tik sukūrėte atlikdami įprastus veiksmus. Kai vykdote derinimą ir pasirodo ekranas, įveskite tekstą ir spustelėkite mygtuką Pateikti.

Apdorotas tekstas rodomas ekrane, kaip tikėtasi.

Dėl to, kad jis taip pat yra išvesties į seką, visual Studio išvesties lange taip pat rodomas tekstas. Tiesą sakant, mes darome tokius dalykus kaip įvesties duomenų bazės duomenų registravimas, bet čia nesupaprastinsime kodo.

Dabar pabandykite pasiekti programą iš už tikslinės svetainės ribų, o derinimo ir vykdymo. Dėl paprastumo, i'll post naudojant įrankį, vadinamą Visual Studio kodas. Jei galite siųsti POST, galite naudoti kitus įrankius arba sukurti kitą svetainę programa ataka.

Kai įdiegiate plėtinį, pavadintą REST kliento Visual Studio kodas, Galite naudoti funkciją, kuri leidžia jums lengvai patikrinti REST API veikimą tiesiog atidarant .http failą.

Kai sukuriate .http failą, panašų į šį tekstinį failą, ir tada atidarykite failą Visual Studio kodas, Galite siųsti GET arba POST spustelėdami siųsti užklausą.

Jei sukursite šiuos POST duomenis, jums bus išsiųstas beveik toks pats duomenų kiekis, kai ekrane įvesite tekstą, ir paspauskite mygtuką "Pateikti". (Localhost prievado numeris turi būti toks pat kaip vykdymo aplinkoje.)

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

Kai siunčiate jį, galite matyti, kad serveris gauna tekstą ir apdoroja.

Visual Studio kodas gali gauti rezultatus. Jei atidžiau pažvelgsite į rezultatų kodą, pamatysite, kad bus rodomas ViewData reikšmių rinkinys. (Jis rodomas Unicode, bet tekstas rodomas teisingai, jei žiūrima žiniatinklio naršyklėje.)

Adresas kelių svetainių užklausą klastotojo pažeidžiamumas

Kaip jau minėjau pradžioje, ASP.NET Core apima priemones prieš kelių teritorijų prašymu klastojimo į sistemą. Bendra priemonė yra iš anksto išduoti unikalų atpažinimo ženklą klientui ekrane, kuriam reikia rašyti ir pan. Jums nereikia priimti apdorojimo, nebent jūs mesti atpažinimo ženklą į serverį.

Žinoma, jei jūs pasieksite URL tiesiai iš išorinės svetainės, atpažinimo ženklas nežinomas ir nepriims apdorojimo.

Pirma, norėčiau pakalbėti apie atpažinimo ženklų išdavimą klientui (HTML), tačiau faktas yra tai, kad sistema negali to padaryti. Eime. Jei formos žymėje nurodysite POST metodą, atpažinimo ženklų parametrus į HTML galite įtraukti be leidimo.

Toliau pateiktame HTML, tai yra įvesties pavadinimas = "__RequestVerificationToken" type = "paslėptas". Tai siunčiama į serverį kartu paspaudus mygtuką Siųsti. Beje, jis nėra pridedamas get metodu.

Serverio pusėje Startup.cs paslaugos. AddControllersWithViews metodo parinktys. Filtrai, į kuriuos AutoValidateAntiforgeryTokenAttribute, visi veiksmai Šis atpažinimo ženklo tikrinimas automatiškai įtraukiamas į (tiksliau tik HTTP metodus POST, PUT, PATCH ir DELETE).

Jei norite įtraukti šį apribojimą tik į konkrečius veiksmus, ne visus veiksmus, vienam valdikliui, kiekvienam veiksmui Taip pat galima nustatyti.

Priešingai, jei norite nustatyti apribojimus daugumai veiksmų, bet norite neįtraukti konkrečių veiksmų, Jei nustatysite IgnoreAntiforgeryToken atributą valdiklio ir veiksmų, tai gerai.

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

Pažiūrėkime, kaip tai veikia. Visų pirma, perdavimo procesas atliekamas iš ekrano paprastai.

Rezultatai atsispindėjo ekrane, kaip tikėtasi.

Jis taip pat išveda į pėdsaką.

Dabar pabandykime jį pasiekti iš išorės.

Prieiga ed, bet netinkama užklausa buvo grąžinta. Tai kitoks rezultatas nei tada, kai nesiimate priemonių. Suprantama, kad jis saugomas, nes jis nėra išvestas į pėdsaką.

Santrauka

Šį kartą aš bandžiau įgyvendinti priemones prieš kelių svetainių prašymą klastotojas. Tai buvo labai lengva įgyvendinti, nes ji jau buvo integruota į sistemą.

Kuriant svetainę reikia daug daugiau pažeidžiamumo nei CSRF. Galite patikrinti, kas ten, arba galite naudoti įrankius, pavyzdžiui, OWASP patikrinti pažeidžiamumą savo svetainėje.