Napad skriptama na web aplikaciju (Cross-Site Scripting, XSS)
Cross-Site Scripting (XSS) je jedan od najčešćih napada na web aplikacije. U ovom napadu, napadač pohranjuje maliciozini CSS, HTML i/ili JavaScript kôd u bazu podataka. Kasnije, kada se taj isti sadržaj prikazuje u okviru web aplikacije, zapravo dolazi do njegovog izvršavanja. Rezultat toga ovisi šta je napadač želio da postigne, a obično je to krađa korisničkih kolačića ili preusmjeravanje povjerljivih informacija na treću web aplikaciju.
Na prvi pogled, sigurnosni propust ovog tipa u web aplikaciji, ne izgleda kao da omogućuje napadaču da napravi ozbiljnu štetu. Međutim, JavaScript je moćan jezik, koji podržava rad sa kolačićima, slikama, DOM manipulaciju, što sve ovo čini XSS napad jako moćnim.
Napadač je u mogućnosti da napiše JavaScript kôd sa beskonačnom petljom, što će blokirati učitavanje web aplikacije. Također, napadač je u mogućnosti da manipuliše sa prozorom preglednika u kojem je učitana web aplikacija i da odmah po učitavanju web aplikacije ga zatvori, čime čini web aplikaciju nedostupnu za korisnike (osim za one koji imaju isključenu podršku za JavaScript).
Možda ovi napadi izgledaju besmisleni, ali ako sponzori plaćaju reklame ili korisnici plaćaju pretplatu za pristup web aplikaciji, onda ovi napadi itekako imaju smisla.
Prevencija od napada skriptama na web aplikaciju
Zaštita od XSS napada je veoma lagana jer PHP nudi set funkcija koje mogu da uklone maliciozni kôd ili da kodiraju karaktere koji imaju specijalno značenje.
Upotreba htmlspecialchars() funkcije
Prva od tih funkcija je htmlspecialchars(). Ova funkcija prima na obradu izvorni ulaz od korisnika u obliku stringa i konvertuje specijalne znakove u odgovarajuće HTML ekvivalente.
Konverzija navedenih znakova u odgovarajuće HTML ekvivalente je dovoljna za sprečavanje XSS napada, odnosno izvršenja ili spašavanje maliciozoinog CSS, HTML ili JavaScript kôda.
Upotreba htmlentities() funkcije
Druga PHP funkcija koja sprečava XSS napad je htmlentities() koja je identična kao i htmlspecialchars(), samo što htmlentities() sve odgovarajuće karaktere pretvara u HTML ekvivalente. Ukoliko je potrebno, moguće je dobiti ponovo izvorni ulaz sa html_entity_decode() funkcijom.
Rezime
XSS je jedan od najučestalijih napada koji je posljedica neobrađenih ulaza na CSS, HTML i JavaScript kôd. Napadač najčešće pokušava da kroz forme web aplikacije pohrani maliciozni JavaScript u bazu ili datoteku, a sa obzirom da je JavaScript moćan jezik, koji omogućava rad sa kolačićima, manipulaciju sa HTML-om i slično, istim je moguće izvesti veoma napredne i ozbiljne sigurnosne napade, poput krađe kolačića i preusmjeravanja ulaznih podataka na treći server. Važno je shvatiti da se XSS napad može izvesti i kroz varijable okruženja, a to se prije svega odnosi na vrijednost IP adrese, dolaznog URL-a ili lokacije skripte. Mnogi programeri misle da ovi podaci dolaze od strane servera, te ih smatraju pouzdanim, međutim napadač je u mogućnosti da ih modifikuje i upravo preko njih izvrši XSS napad. Zaštita od XSS napada je jednostavna, a svodi se na saniranje svakog ulaznog podataka kombinovanom upotrebom htmlspecialchars() i strip_tags() funkcija koje će ukloniti maliciozni kôd.