📖 CSRF Napadi (Cross-Site Request Forgery)
Anatomija Napada (Krađa Identiteta)
Zamislite da ste prijavljeni u aplikaciju Ministarstva Finansija (imate važeći Auth Cookie). Zatim, u
drugom tabu otvorite maliciozni portal. Taj zlonamjerni portal u pozadini pošalje skrivenu
POST formu natrag ka serveru Ministarstva:
/Budzet/PrebaciSredstva?Iznos=1000000&Racun=HAKER.
Budući da zahtjev ide s vašeg browsera, browser će automatski prikačiti vaš kolačić za prijavu (Auth Cookie). Server Ministarstva dobija zahtjev za prenos novca od "Administratora" i on će to naivno izvršiti, iako vi niste kliknuli ništa u samoj aplikaciji Ministarstva!
🛡️ AntiForgeryToken (Rješenje protiv CSRF-a)
Rješenje je dodavanje tajnog, jednokratnog ključa koji generiše server (Synchronizer Token Pattern). Haker koji kontroliše zlonamjernu stranicu nema načina da pogodi ovaj jedinstveni token.
@using (Html.BeginForm("OdobriTransfer", "Budzet", FormMethod.Post))
{
// OVO JE KRITIČNO! Generisaće skriveno polje sa nasumičnim stringom
// i istovremeno upisati istu vrijednost kao šifrirani kolačić.
@Html.AntiForgeryToken()
}
[HttpPost]
[Authorize(Roles = "Ministar")]
// OVO JE KRITIČNO! Bez ovoga, haker može poslati zahtjev, a MVC ga NEĆE zaustaviti!
[ValidateAntiForgeryToken]
public ActionResult OdobriTransfer(int BudzetId)
{
// Aplikacija prima iz Hidden fielda string ABC, i iz Cookie string ABC.
// Ako se slažu, zahtjev je autentičan. Ako ih nema ili se ne slažu, baca se Exception!
// Logika prijenosa novca...
return View("Uspjesno");
}
🔒 XSS (Cross-Site Scripting)
XSS je napad gdje korisnik uspije unijeti maliciozni JavaScript kod u naša polja (npr. u "Opis zahtjeva"), i onda se ta JS skripta izvršava u tuđim pretraživačima (npr. kada "Službenik" to pročita, ukrade mu se token).
MVC Vas Štiti Automatski (Skoro uvijek)
Srećom, Razor syntax @Model.Opis vrši automatsko HTML Enkodiranje. Ako
korisnik unese <script>alert(1)</script>, MVC će to na ekranu ispisati kao
običan tekst koristeći HTML entitete, bezbjedno sprečavajući izvršavanje!
OPASNOST: Problem nastaje kada želite dozvoliti korisnicima formatiranje teksta (Bold,
Italic, Slike) koristeći WYSIWYG editore (Summernote, TinyMCE). Tu morate isključiti zaštitu koristeći
@Html.Raw(Model.Opis). Tada POSTAJETE RANJIVI!
// AKO koristite @Html.Raw(), na strani Kontrolera MORATE filtrirati HTML ("Sanitize")
// Preporučena biblioteka za .NET je "Ganss.Xss" (HtmlSanitizer)
[HttpPost]
[ValidateInput(false)] // Isključujemo ugrađenu provjeru koja ruši aplikaciju ako se nađe < tag
public ActionResult ObjaviObavjestenje(AritcleVM model)
{
var sanitizer = new HtmlSanitizer();
// Sanitizer će proći kroz HTML, obrisati sve