MODUL 7 - LEKCIJA 3

Napredna Sigurnost (CSRF, XSS, SQLi, Hardening)

Odbrana od OWASP Top 10 prijetnji i sigurnosno učvršćivanje aplikacije (Hardening)

⏱️ Trajanje: ~4 časa 📚 Nivo: Napredni 🎯 Praktični primjeri: 6

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

🛠️ Korak 1: Zaštita Forme na View-u
@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()
    
    
    
}
🛠️ Korak 2: Enforcement na Kontroleru
[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!

🛠️ Sanitizacija dozvoljenog HTML-a
// 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