TAG | bezbednost
3.2 FORME I URL ADRESE
3.2.1 Forme i podaci
(izvor: Diplomski rad Miloša Miloševića, VETŠ Beograd 2008/09)
Iako korisnici mogu slati podatke na mnogo načina, većina aplikacija prima svoje
podatke kao rezultat akcije neke forme iz pretraživača klijenata. Korisnik može slati
podatke na tri načina: putem URL adrese (primer su podaci koje daje globalni niz
$_GET), u sadržaju zahteva (primer su podaci koje daje forma kroz globalni niz
$_POST) ili u HTTP zaglavlju (primer su podaci iz $_COOKIE niza a od cookie
(kolačića) sa klijentske strane). Pri pisanju forme gotovo je uvek potrebno kao metod
slanja podataka navesti POST. Druga opcija je GET i podaci pri slanju forme će biti
vidljivi u zahtevanoj adresi slanja to nije slučaj kod POST metode slanja.
Primer GET metode slanja podataka:
vrednosti korisnickog imena milos i lozinka milos .
Primer POST metode slanja podataka:
Sa ove forme korisnik stiže na adresu login.php, vrednosti koje je uneo na prethodnoj
stranici sada nisu vidljive u adresi nove stranice.
3.1 BEZBEDNOST PHP MODULA
3.1.1 Register globals
(izvor: Diplomski rad Miloša Miloševića, VETŠ Beograd 2008/09)
Ovaj modul ne predstavlja opasnost bezbednosnoj zaštiti već programer mora da napravi grešku. Ipak postoje dva glavna razloga zbog kojih je poželjno praviti aplikacije sa isključenim modulom register globals:
- on može povećati opasnost od bezbedonosne propustljivosti
- krije poreklo podataka što može dovesti da programer više ne može da prati poreklo podataka iz aplikacije.
Kada se uključi modul register_globals tada se svi primljeni podaci iz super globalnih nizova prevode u jednostavne promenljive u kodu i time olakšavaju napadaču napad na web aplikaciju. Modul register_globals treba isključiti a sve podatke koji pristižu treba uzimati preko $_POST ili $_GET.
3.1.2 Error Reporting
Svaki programer pri razvoju aplikacije pravi greške i ovaj modul koji dolazi uz PHP omogućava detaljan prikaz greške na ekranu koji može videti i potencijalni napadač i upotrebiti u napadu na aplikaciju. Potrebno je podesiti display_errors na Off i podesiti log_errors na On i odrediti lokaciju datoteke u kojoj će biti upisani detalji greške sa error_log. U slučaju da programer nema pristup konfiguracionoj datoteci php.ini može se koristiti php ugrađena funkcija ini_set(). Funkcija ini_set() kao argumente prima naziv promenljive čije se svojstvo menja i svojstvo koje se postavlja. Dejstvo funkcije ini_set() je samo nad skriptom koja se učitava, nakon završetka skripte vraćaju se vrednosti koje su originalno bile podešene.
<?php
ini_set(‘error_reporting’, E_ALL | E_STRICT );
ini_set(‘display_errors’, ‘Off’);
ini_set(‘log_errors’,’ On’);
ini_set(‘error_log’,’/usr/local/apache/logs/error_log’);
?>
3.1.3 Allow url fopen
Allow_url_fopen predstavlja još jedan PHP modul i on dozvoljava programerima da tretiraju URL adrese kao datoteke. Obično je slučaj da se podaci iz zahteva koriste kako bi se odredila datoteka koju treba učitati:
http://www.primer.com/pogled.php?dat=index.php
Onda aplikacija koristi PHP funkciju include() na sledeći način:
$dat=$_GET[’dat’];
include($dat);
Napadač može da promeni vrednost parametra dat i da učita bilo koju datoteku sa web servera. Da bi se sprečio mogući napad ovaj modul treba unapred preventivno isključiti.
3.1.4 Filtriranje ulaza
Filtriranje ulaza predstavlja proces kojim se proverava validnost podataka koji se dobijaju sa klijentske strane. Ukoliko se svi podaci pravilno filtriraju može se smanjiti rizik da se podaci zloupotrebe u aplikaciji. Veliki broj bezbednostih propusta u PHP aplikacijama može se pripisati loše filtriranim podacima. Pri filtriranju ulaza obično se podrazumeva: identifikacija izvora ulaznih podataka, filtriranje ulaza, razlikovanje zlonamerno poslatih podataka.
Izvori podataka mogu biti i klijent i serveri baza podataka ili neke datoteke koje PHP aplikacije mogu učitavati sa udaljenih izvora. Podaci koji dolaze od klijenata se lako razlikuju i obično su smešteni u super globalne nizove kao što su $_POST ili $_GET. Drugi ulazi mogu biti teži za identifikaciju kao što je $_SERVER globalni niz gde neke od elemenata klijenti mogu zloupotrebiti. Pošto se identifikuje izvor podataka potrebno je izvršiti validaciju podataka tj. filtriranje ulaza.
Podatke koje klijenti šalju nikada ne treba ispravljati jer se pokazalo da je ovaj pristup pogrešan i samo stvara bezbedonosne probleme. Validacijom se mogu proveravati podaci tako da se određeni karakteri mogu zabraniti ili se mogu propuštati samo određeni tipovi podataka. Primer:
<?php
$cisto=array();
if(ctype_alnum($_POST[‘korisnickoime’]){//ukoliko je korisnicko ime alfanumeričkog tipa
$cisto[‘korisnickoime’]=$_POST[‘korisnickoime’];
}
?>
3.1.5 “Escape” ulaznih podataka
Jedan od stubova sigurnosti web aplikacija je praksa da se vrši enkodovanje određenih karaktera tako da njihovo originalno svojstvo bude sačuvano. Pri slanju podataka klijentu koriste se PHP ugrađene funkcije. Praksa je i da se definiše poseban niz podataka koji prima očišćene podatke klijenata. Takav niz je prvo potrebno inicijalizovati na prazan niz a potom ga popunjavati sa primljenim podacima.
Jedna od funkcija za ovaj postupak je htmlentities() koja sve karaktere koje prima kao argumente pretvara tako da se oni mogu prikazati klijentima u pretraživačima kao HTML kodovi. Ukoliko je definisano da određen podatak može biti samo alfanumeričkog tipa onda se ovaj postupak može i zaobići.
Što se tiče slanja podataka u bazu za korisnike MySQL baze podataka može se koristiti funkcija mysql_real_escape_string() koja će podatke prilagoditi za validan unos u bazu. PHP podržava dosta baza podataka i za svaku ima odgovarajuću funkciju koja vrši ovu operaciju. Ukoliko ipak za neku bazu ne postoji slična funkcija može se koristiti funkcija addslashes().
Primer:
<?php
$html=array();
$html[‘korisnickoime’]=htmlentities($_cisto[‘korisnickoime’],ENT_QUOTES,’UTF-8’);
?>


