Cross Site Scripting
SADRŽAJ
Otmica sesija (Session Hijacking)
Fiksacija sesije (Session Fixation)
ZAŠTITA OD LAŽNOG PREDSTAVLJANJA FORME (OBLIKA)
..................................8
CSRF ranjivost i specifičnosti napada
VALIDACIJA I FILTRIRANJE UNOSA (INPUT-A)
...........................................................11
Validacija brojnih vrijednosti
Regularni izrazi – regular expression, regex
..........................................................................................15
IZBJEGAVANJE CROSS-SITE SKRIPTIRANJA (CROSS SITE SCRIPTING) - XSS
Escape inputa – mysql_real_escape_string ()
.................................................................................................21
Prepared statements (pripremljeni izrazi)
ČUVANJE LOZINKE VAN DATOTEKA SAJTA
.................................................................22
1
Funkcije password_hash() i password_verify()
............................................................................................24
SUOČAVANJE SA IZGUBLJENIM LOZINKAMA
.............................................................25
POTVRĐIVANJE PODATAKA SA HEŠOM
..........................................................................26
ŠIFROVANJE I DEŠIFROVANJE PODATAKA
...................................................................28
SKLADIŠTENJE ŠIFROVANIH PODATAKA U DATOTECI ILI BAZI PODATAKA
...........................................................................................31
SSL (Secure Sockets Layer) sertifikati
Kupovina SSL sertifikata ili korišćenje besplatnog sertifikata – AutoSSL / Let’s Encrypt
Instalacija i provjera SSL sertifikata
Izmjena svih HTTP linkova u HTTPS linkove
..............................................................................................33
Postavljanje trajne (301) redirekcije sa HTTP na HTTPS verziju web stranice
............................................33
Zaštita od lažnog predstavljanja forme (oblika)
......................................................................................35
Osiguravanje filtriranja unosa (input-a)
..................................................................................................35
Izbjegavanje Cross-Site skriptiranja
Čuvanje lozinke van datoteka vašeg sajta
................................................................................................36
Suočavanje sa izgubljenim lozinkama
Potvrđivanje podataka sa hešom
2

U slučaju kada se koriste podaci koji su obezbijeđeni od neke treće strane, uključujući i
podatke od samih korisnika, potrebno je prvo verifikovati da su validni. Ovaj proces je poznat kao
filtriranje. Potrebno je naglasiti da se ne mogu svi bezbjedonosni problemi riješiti filtriranjem input-
a i izbjegavanjem output-a.
Bezbjednost se može podići na viši nivo prostim testiranjem. Razmišljanjem kao da ste
napadač, uzima se u obzir svaki mogući scenario i na taj način se koristi aplikacija. Obično se kreće
od prostijih stvari: isključivanjem JavaScript, nakon čega se šalje prazan formular, unose neispravni
podaci, pokušaj SQL Injection.
Usko povezano sa bezbjednošću je šifrovanje. Šifrovanje predstavlja jedan moćan alat koji
pomaže da se poveća sigurnost aplikacije, ukoliko se koristi ispravno. Šifrovanje se koristi za
kodiranje podataka. Ukoliko se kodiranje podataka ne može dešifrovati bez velike količine obrade,
tada se to naziva jednosmjernim šifrovanjem ili heširanjem (
one-way encryption
or
hashing)
.
Ostale metode šifrovanja rade u dva pravca: podaci se šifruju, a onda se dešifruju.
PHP snabdijeva alatima za šifrovanje i zaštitu podataka. Neki alati su dio PHP osnovnog
seta funkcija (
pass word_hash()
funkcija), a neki su proširenja koja eksplicitno treba da budu
uključena kada se PHP sastavlja (
mcrypt
,
mhash
, i
cURL
).
Osjetljivi podaci treba da budu zaštićeni ne samo na serveru, već i kada putuju kroz mrežu
između servera i korisnika. Podaci poslati regularnim
HTTP
su vidljivi svima koji imaju pristup
mreži u bilo kom trenutku, između vašeg servera i korisnika.
4
2. Sesije
Sesije predstavljaju jedinstvenu vezu između vašeg računara i serverskog računara. Može se reći
da omogućavaju da se izgradi veća inetrakcija sa posjetiocima, gdje se pri svakom zahtjevu zna da
se radi o određenom korisniku i da se njemu pružaju sadržaji koji su namijenjeni isključivo za
njega, individualno. Pored toga, server koristi sesiju radi praćenja statusa vašeg rada. Server kreira
sesije po potrebi. Kada se otvori web stranica u pretraživaču, server kreira sesiju i učitava poslednju
verziju web stranice. Iako može biti otvorena samo jedna web stranica po sesiji, ista web stranica
može biti istovremeno otvorena u nekoliko različitih sesija od strane različitih korisnika. Ali isto
tako, može se imati istovremeno otvorenih više sesija, sa istom ili različitom web stranicom.
Sesija se može završiti (ili okončati) kada je korisnik prekine, eksplicitno ili implicitno.
Međutim, postoji mogućnost da se sesija završi iako korisnik nije završio sa njom, tako što je
server završava jer je otkrio da nije postojala korisnička interakcija u okviru odrđenog perioda.
Ukoliko server završi sesiju na ovaj način, to se naziva vremenskim ograničenjem sesije.
Kako bi se spriječilo vremensko ograničenje sesije, morate imati interakciju sa web stranicom.
Kada server otkrije korisničku interakciju sa web stranicom, sesija ostaje aktivna.
Potrebno je istaći da sesije omogućavaju kreiranje varijable koje traju između zahtjeva. Kako bi
sesije mogle da funkcionišu, svaki zahtjev korisnika mora da sadrži identifikator sesije koji
jedinstveno identifikuje sesiju, odnosno i klijent i server moraju imati neke indentične podatke za
identifikaciju.
Podrazumijeva se da, PHP prihvata identifikator sesije poslat u kolačiće (
cookies
), ali ako je
session.use_on ly_cookies
podešen na 1, on će prihvatiti identifikator sesije u URL. Napadač može
prevariti žrtvu prateći vezu do vaše aplikacije koja uključuje ugrađeni identifikator sesije:
<a href="http://example.org/login.php?PHPSESSID=1234">Click Here!</a>
Korisnik koji prati ovaj link će nastaviti sesiju identifikovanu kao 1234. Dakle, napadač sada
zna korisnički identifikator sesije i može pokušati da otme sesiju korisnika predstavljajući isti
identifikator sesije.
Ukoliko se korisnik nikada ne prijavi ili ne izvrši bilo koju radnju koja ga diferencira od ostalih
korisnika vaše aplikacije, napadač ne postiže ništa otimanjem sesije. Stoga, osiguravajući da se
identifikator sesije obnavlja kad god postoji promjena u nivou privilegija, efikasno se eliminiše
napad fiksiranja sesije. PHP vodi računa o ažuriranju skladišta podataka sesije i propagiranju novog
identifikatora sesije, pa se ova funkcija poziva samo po potrebi.
Dok je čuvanje i vođenje sesije preko URL adrese veoma nesigurno, čuvanje u kolačićima
(cookies) je znatno sigurnije, iz sledećih razloga:
kolačići se ne vide, odnosno šalju se kroz header zahtjeva,
mogu biti enkriptovani i tako transportovani (HTTPS).
Mana kolačićima je u tome što se na klijentskoj strani mogu isključiti, pa u tom slučaju se sesija
ne bi mogla održati. U novijim verzijama PHP-a, podrazumijevano je uključeno čuvanje
5

2.2. Fiksacija sesije (Session Fixation)
Fiksacija sesije predstavlja kreiranje identifikatora sesije od strane napadača i na taj način vrši se
ignorisanjePHP sistema za kreiranje identifikatora. Osim toga što ovo može da izazove greške u
radu aplikacije, može da predstavlja i veoma ozbiljan sigurnosni propust. Da bi se ovo riješilo
potrebno je izvršiti ponovno generisanje identifikatora sesije:
<?php session_star () ; if(!isset ($_SESSION ['pokrenuta'])){session_regenerate_id ();
$_SESSION {'pokrenuta'}=true;}?>
Zaštita je upravo u toj provjeri da li je takva sesija već pokrenuta i ukoliko nije, generisaće se
novi identifikator sesije koji će ujedno prepisati identifikator napadača. Ovaj kod je „best practice“
za kreiranje sesija.
7
Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.
Slični dokumenti