Kada govorimo o bezbednosti web aplikacija, većina ljudi prvo pomisli na lozinke, SSL sertifikate, hakovanje naloga ili zaštitu baze podataka. Međutim, postoji jedna vrsta napada koja je veoma opasna upravo zato što koristi nešto što već deluje legitimno — prijavljenog korisnika. Taj napad se naziva CSRF, odnosno Cross-Site Request Forgery.
CSRF je bezbednosni problem kod kog napadač pokušava da natera browser prijavljenog korisnika da pošalje zahtev ka aplikaciji bez njegove stvarne namere. Ako aplikacija nema odgovarajuću zaštitu, server može taj zahtev prihvatiti kao validan samo zato što je stigao uz postojeću korisničku sesiju. U praksi to znači da napadač ne mora da ukrade lozinku da bi izazvao problem — dovoljno je da iskoristi činjenicu da je korisnik već prijavljen.
Zbog toga je CSRF zaštita jedan od osnovnih elemenata svake ozbiljne web aplikacije koja koristi sesije, korisničke naloge, administraciju, forme za izmenu podataka, workflow procese ili bilo koju akciju koja menja stanje sistema.
Šta zapravo znači CSRF
CSRF je skraćenica od Cross-Site Request Forgery, što se najjednostavnije može objasniti kao podmetanje zahteva preko prijavljenog korisnika.
Na primer, korisnik je prijavljen u admin panel, CRM, web shop, bankarsku aplikaciju ili interni informacioni sistem. Dok je i dalje prijavljen, otvori drugi sajt, klikne na zlonamerni link ili pregleda sadržaj koji u pozadini pokušava da pošalje zahtev ka aplikaciji u kojoj je korisnik aktivan. Browser automatski šalje sesione kolačiće uz zahtev, a server može pogrešno zaključiti da je zahtev došao direktno od legitimnog korisnika.
Upravo u tome leži opasnost. Sistem vidi validnu sesiju i misli da je sve u redu, iako korisnik zapravo nije želeo da izvrši tu akciju.
Kako funkcioniše CSRF napad
Da bismo razumeli koliko je ova ranjivost opasna, važno je da razumemo kako napad izgleda u praksi.
Zamislimo da je korisnik prijavljen na vaš sajt. Njegov browser već ima aktivan session cookie. Ako napadač uspe da ga navede da otvori zlonamerni sadržaj, taj sadržaj može pokušati da pošalje zahtev prema vašem serveru. Ako server ne proverava da li je zahtev zaista nastao iz vaše aplikacije, akcija može biti izvršena.
Takva akcija može biti:
- promena lozinke
- promena email adrese
- brisanje podataka
- dodavanje novog korisnika
- promena privilegija
- potvrda narudžbine
- pokretanje interne workflow radnje
- odobravanje zahteva ili transakcije
Drugim rečima, CSRF omogućava da sistem izvrši radnju u ime korisnika bez njegovog znanja i stvarne namere.
Zašto do CSRF problema uopšte dolazi
Glavni razlog je način na koji browser radi sa kolačićima i sesijama. Kada je korisnik prijavljen na određeni sajt, browser automatski uz odgovarajući zahtev šalje session cookie. To je normalno i potrebno za rad aplikacije. Problem nastaje kada server prihvata svaki zahtev koji stiže sa validnim kolačićem, bez dodatne provere da li je zahtev nastao iz legitimnog korisničkog interfejsa vaše aplikacije.
Tu dolazi do izražaja razlika između:
- autentikacije korisnika
- i potvrde da je konkretna akcija zaista namerno pokrenuta iz vaše aplikacije
CSRF zaštita upravo služi da popuni tu prazninu.
Šta je CSRF token
CSRF token je jedinstvena, nasumično generisana vrednost koju server kreira i vezuje za korisničku sesiju ili konkretan zahtev. Kada korisnik otvori formu ili interfejs za neku osetljivu radnju, sistem uz tu formu ubacuje i token. Kada korisnik pošalje zahtev, taj token ide zajedno sa zahtevom, a server proverava da li je ispravan.
Ako token nedostaje ili nije validan, zahtev se odbija.
Na taj način server ne proverava samo da li korisnik ima važeću sesiju, već i da li je zahtev zaista došao iz legitimnog toka rada aplikacije.
Kako se CSRF token koristi u praksi
U klasičnim web aplikacijama token se najčešće ubacuje u formu kao skriveno polje. Kada korisnik klikne na dugme za snimanje, izmenu ili brisanje, forma šalje i CSRF token. Server zatim upoređuje poslatu vrednost sa onom koju očekuje.
Ako su vrednosti iste, zahtev se prihvata. Ako nisu, zahtev se odbija kao nebezbedan.
Kod AJAX zahteva i modernih SPA aplikacija, token se često šalje kroz posebno HTTP zaglavlje. Suština ostaje ista: aplikacija mora imati dodatni dokaz da zahtev nije podmetnut sa treće strane.
Zašto se CSRF zaštita koristi
CSRF zaštita se koristi zato što obična korisnička sesija nije dovoljna da dokaže da je akciju zaista inicirao korisnik. Bez dodatne zaštite, sistem je previše poverljiv prema browseru koji šalje validan session cookie.
Uvođenjem CSRF tokena postiže se:
- dodatna kontrola nad zahtevima koji menjaju stanje
- zaštita od lažnih zahteva sa drugih sajtova
- veća bezbednost korisničkih naloga i administracije
- manja mogućnost neovlašćenih promena podataka
- sigurniji rad sa formama, odobrenjima i kritičnim akcijama
To je posebno važno kod poslovnih aplikacija, administrativnih panela, DMS sistema, CRM i ERP rešenja, bankarskih portala, platformi za kupovinu i svih sistema u kojima jedan klik može imati ozbiljne posledice.
Koliko je CSRF bitan u razvoju aplikacija
CSRF zaštita nije nešto što se dodaje samo “ako ima vremena”. Ona je važan deo bezbednosne arhitekture aplikacije.
Ako aplikacija koristi cookie-based autentikaciju, CSRF zaštita treba da bude standard. Što je aplikacija složenija i što su akcije osetljivije, to je značaj CSRF zaštite veći.
Posebno je bitna u sledećim slučajevima:
- admin paneli
- korisnički nalozi
- sistemi za odobravanje zahteva
- HR i finansijski sistemi
- platforme sa internim workflow procesima
- aplikacije sa izmenama podataka
- web shop sistemi
- sistemi za upravljanje dokumentima
- SaaS platforme
U svim tim slučajevima posledice uspešnog CSRF napada mogu biti veoma ozbiljne.
Šta se postiže primenom CSRF tokena
Kada pravilno implementirate CSRF token, postižete da vaš server prihvata samo one zahteve koji imaju dodatni dokaz legitimnosti. To znači da treći sajt, zlonamerni email ili lažni link više ne mogu lako da izazovu akciju samo na osnovu toga što je korisnik prijavljen.
Primenom CSRF tokena dobijate:
Veću kontrolu nad zahtevima
Server ne veruje svakom zahtevu koji dolazi uz sesiju, već proverava i dodatni zaštitni element.
Zaštitu važnih akcija
Izmene profila, promene lozinke, dodavanje podataka, brisanje i odobravanje zahteva postaju znatno sigurniji.
Pouzdaniju aplikaciju
Bezbednosna kultura aplikacije raste, a rizik od ozbiljnih zloupotreba se smanjuje.
Bolji kvalitet razvoja
CSRF zaštita pokazuje da aplikacija nije razvijena samo funkcionalno, već i bezbednosno odgovorno.
Šta se dešava ako se CSRF token ne koristi
Ako aplikacija nema CSRF zaštitu tamo gde je potrebna, ostavljate veoma ozbiljan prostor za zloupotrebu.
U tom slučaju napadač može pokušati da iskoristi aktivnu sesiju korisnika i natera njegov browser da izvrši zahteve bez njegovog znanja. Posledice mogu uključivati:
- neovlašćene izmene korisničkog profila
- promenu lozinke i zaključavanje korisnika
- menjanje kontakt podataka
- dodavanje ili brisanje zapisa
- promenu prava pristupa
- slanje ili potvrdu transakcija
- pokretanje radnji u internim poslovnim procesima
Ono što ovde dodatno zabrinjava jeste to što se sve to može desiti bez direktnog proboja korisničkog naloga. Korisnik je prijavljen, a aplikacija sama prihvata zahtev jer nema mehanizam da proveri da li je zahtev zaista došao iz njenog interfejsa.
Da li je CSRF token dovoljan sam po sebi
Veoma je važan, ali nije jedina mera zaštite.
Dobra bezbednosna praksa podrazumeva da se CSRF token koristi zajedno sa drugim merama, kao što su:
- pravilno podešeni session kolačići
- SameSite atribut na kolačićima
- provera Origin i Referer zaglavlja
- zabrana da GET zahtevi menjaju stanje
- dobra kontrola pristupa
- zaštita od XSS ranjivosti
Ovo je posebno važno zato što XSS ranjivost može ugroziti i CSRF zaštitu. Ako napadač uspe da izvrši zlonamerni JavaScript unutar vaše aplikacije, može pokušati da pristupi tokenu ili zaobiđe deo zaštite. Zato CSRF nikada ne treba posmatrati odvojeno od ukupne bezbednosti aplikacije.
Gde se CSRF token obavezno koristi
CSRF token treba koristiti za sve zahteve koji menjaju stanje sistema. To su najčešće:
- POST
- PUT
- PATCH
- DELETE
Ako vaša aplikacija koristi GET za radnje koje menjaju podatke, to je dodatni problem koji treba ispraviti. GET zahtevi bi trebalo da služe za čitanje i prikaz, a ne za brisanje, izmenu ili potvrdu radnji.
Drugim rečima, svaka akcija koja menja podatke, stanje procesa, prava pristupa ili korisnički nalog treba da ima CSRF zaštitu.
CSRF je ozbiljna bezbednosna ranjivost koja iskorišćava poverenje aplikacije u već prijavljenog korisnika. Napad se zasniva na tome da browser automatski šalje sesione kolačiće, a server bez dodatne provere može prihvatiti zahtev koji korisnik nikada nije nameravao da pošalje.
CSRF token je zato jedan od najvažnijih mehanizama zaštite u razvoju web aplikacija. Njegova uloga je da dokaže da zahtev nije podmetnut sa treće strane, već da zaista potiče iz legitimnog toka vaše aplikacije.
Primenom CSRF tokena postižete veću bezbednost, sigurnije forme, bolju zaštitu naloga i manji rizik od neovlašćenih promena. Ako ga ne koristite tamo gde treba, izlažete aplikaciju ozbiljnoj ranjivosti koja može dovesti do zloupotrebe korisničkih naloga, administracije i poslovnih procesa.
Zato se danas ne postavlja pitanje da li CSRF zaštita treba da postoji, već da li je pravilno implementirana na svim mestima gde aplikacija menja stanje sistema.
