PHP saugumas antra dalis
Po ilgos pertraukos pasirodo antra dalis! Dėkui tiems kas laukė, ir tikimės bus tokia pat naudinga kaip ir pirmoji dalis. Antroje dalyje apžvelgiami šiek tiek advanced būdai apsisaugoti nuo įsilaužimų, kadangi tobulėjant technologijoms, ir hakerių atakos tampa sudėtingesnės bei sukeliančios didesnių bėdų.
Failų apsaugojimas
Didžioji dalis web hostingo kompanijų serverių konfigūracijų yra lengvai nuspėjamos. Lygiai taip pat yra nuspėjami ir web tinklapių kūrėjai. Tarkime, galime nesunkiai atspėti, kad įterpiami failai (include’inami) guli www.saitas.lt/includes kataloge. Jei serveris nėra tinkamai sukonfiguruotas ar kitais būdais apsaugotas, mes, kreipęsi į šį katalogą, galime matyti visus jame gulinčius failus.
Įsivaizduokime, jog norime kad skirtingi mūsų puslapio skriptai bendrautų su duomenų baze, todėl sukuriame bendrą nustatymų failą, pavadiname jį “dbconnect.inc” arba panašiai ir įkeliame jį i “includes” katalogą. Deja, taip daro daugelis žmonių. Dažniausiai web serveris tokius failus supranta kaip default tekstinius, todėl davę užklausą į tokį failą, mes galėsime matyti prisijungimo į duomenų bazę duomenis.
Nuspėjamų pavadinimų failus nerekomenduojama talpinti į nuspėjamas vietas. Išeitis gali būti iškelti juos iš web serverio root katalogo, tokiu būdu nebus galima pasiekti jų iš išorės. Kad padidinti saugumą, galime jį taip pat užvadinti sunkiau nuspėjamu pavadinimu, taip pat, laikant katalogus web serverio pasiekiamumo ribose, būtina sudėti index.html failus, kurie būtų bent jau tušti, tokiu būdu neleidžiant matyti katalogo turinio.
PHP skriptuose niekada nenaudokite ‘.inc’ failų plėtinių, pervadinkite juos į ‘.inc.php’. Tai užtikrins, kad failas būtų interpretuojamas PHP varikliuko, ir slaptažodžiai nepateks į ekraną. Net jei ir serveryje įvesta konfigūracija draudžianti gauti katalogo turinį (list), būtinai turėkite index.html failą, taip nereiks sukti galvos pasikeitus serverio nustatymams arba hostingo tiekėjui. Be abejo, dar stipriau yra iškart turėti ir .htaccess failus, kurie draustų matyti katalogo turinį.
Pasinaudoti minėtomis saugumo spragomis net nebūtina spėlioti - pakanka pateikti tinkamas užklausas googlui.
Slaptažodžio apsaugojimas
Dauguma tinklapių šiandien neapseina be administravimo įrankių ar TVS (turinio valdymo sistema). Kaip jau minėta pirmoje dalyje, šiuos skriptus įkelti galime į sunkiai nuspėjąmą katalogą, tačiau tai nėra tvirta apsauga. Daugumoje TVS vartotojams leidžiama pasikeisti savo slaptažodį. Vartotojas gali pasirinkti lengvai įsimenamą, trumpą slaptažodį. Be abejo, reikia nustatyti ir šiokias tokias slaptažodžio sukūrimo taisykles, ir neleisti vartotojui įvesti trumpesnį nei, tarkim, 6 simbolių slaptažodį, kuris turi būtinai turėti skaitmenį ar dar kokių spec. simbolių. Įsibrovėliai dažnai naudoja vadinamąsias “žodyno” atakas (”brute force” metodas). Žodyno ataka naudoja visus žodžius iš tam tikro sąrašo (žodyno) slaptažodžio įvedimui, kol šis atspėjamas.
Net ir sudėtingi slaptažodžiai anksčiau ar vėliau gali būti atspėti. Nuo šių atakų apsisaugoti paskutiniu metu itin išpopuliarėjo “captchas”, tai yra raidžių ir skaitmenų seka, kurią privalo įvesti vartotojas, norėdamas prisijungti. Ši seka turi būti sugeneruojama į paveikslėlį su įvairiais iškraipymais, ir kaskart turi būti pateikiama skirtingas atsitiktinių simbolių kratinys. Tai leidžia žinoti, kad sėkmingai prisijungs tik žmogus, kuris sugebės atpažinti raides ir skaičius, bet to nesugebės padaryti kenkėjiškas kompiuterinis skriptas.
Prisijungimo saugumą padidina ir elementarus skaitiklis. Bandymai prisijungti išsaugomi, ir tarkim, po 3 nesėkmingų sykių vartotojas tam tikram laikui yra deaktyvuojamas, tai yra negali prisijungti iš viso, o galbūt net privalo kreiptis į sistemos administratorius, kad rankiniu būdu būtų aktyvuotas vėl. Tai gali būti nepatogu vartotojams, tačiau labai naudinga galimybė. Sekdami vartotojo prisijungimus, laiką, IP adresus, žinosite kas ir kaip naudojasi sistema. Jei aptinkate didelį nesėkmingų bandymų prisijungti skaičių iš vieno IP adreso, galite jį tiesiog užblokuoti. Gal verta dėmesio galimybė ir suteikti prisijungimą tik iš nurodytų adresų, o visus kitus blokuojant? Paprasta, nepatogu, tačiau labai saugu.
Duomenų bazės saugumas
Šiandien itin didelis dėmesys skiriamas duomenų bazėms. Retas puslapis apseina be jų. Kai kurios atakos būna nukreiptos būtent į jas. Tai žinant, galima sumažinti jos atakos padarinius. Beveik visi duomenų bazių serveriai leidžia suteikti skirtingas privilegijas vartotojams. Galite (ne)suteikti vartotojui teises kurti, redaguoti, trinti ir daug kitų. Paprastai, duomenų bazės vartotojui, kuris dirba su duomenų bazę viešai, užtenka suteikti kūrimo ir redagavimo teises. Skriptai, kurie turi trinti tam tikrus duomenis, gali apsieiti ir be trynimo teisės, kuri gali būti skausminga. Duomenų bazės lentelėje įvedus papildomą lauką “deleted”, ir skriptui įvykdžius trynimo funkciją, įrašas paredaguojamas ir “deleted” laukui suteikiama reikšmė “1″. Su tokiais įrašas skriptas elgiasi taip, tarsi jie būtų ištrinti, nors realiai bet kada duomenis galėsite peržiūrėti ar atkurti. Vėliau, kai tikrai žinosite, jog duomenys tikrai nebereikalingi ir buvo ištrinti ne piktavalio, galėsite duomenis tikrai ištrinti. Jei duomenų bazės vartotojas negalės trinti įrašų ar naikinti lentelių, to negalės padaryti ir įsilaužėlis, sužinojęs jo prisijungimo duomenis.
Nesaugios funkcijos
PHP turi funkcijų, kurios gali atlikti sistemos nustatymus ar bendrauti su kitomis programomis. Jei žinote, kad jomis vistiek nesinaudosite, rekomenduojama jas išjungti.
Pavyzdžiui, funkcija eval() stringą interpretuoja kaip PHP komandą ir ją įvykdo. Jei šioje funkcijoje naudojami vartotojo įvedami duomenys, jis gali pridaryti nemažai žalos. Be itin atidaus įvedimo tikrinimo, vartotojas gali paleisti bet kokią programą.
Pirmiausia, reikia vengti naudoti eval() funkciją. PHP leidžia php.ini faile su direktyva “disable_functions” leidžia per kablelį nurodyti visas funkcijas, kurių vartojimas turi būti draudžiamas. Dažniausiai atjungiamos tokios funkcijos kaip: ini_set(), exec(), fopen(), popen(), passthru(), readfile(), file(), shell_exec(), system().
Dažnai verta įjungti ir safe_mode režimą serveryje. Šis režimas nurodo PHP apriboti funkcijų ir operatorių naudojimą, kurie gali sukelti problemų. Nuo to nukenčia funkcionalumas, tačiau jei įjungus safe_mode, skriptai vistiek tvarkingai veikia, šį nustatymą verta palikti. Saugaus režimo ir nesaugių funkcijų atjungimas yra būtinas hostingo kompanijose, kur vienu serveriu naudojasi daugelis vartotojų.
Antra dalis baigta. Didžiosios dalies saugumo problemų paprastai išvengiama tiesiog atidžiai tvarkantis su vartotojo įvedamais duomenimis. Jei Jūs galite tikėtis paties blogiausio ir pačių pikčiausių hakerių, vadinasi galite susitvarkyti su bet kuo.
February 16th, 2006 at 12:39 pm
kiek pamenu, safe_mode bus išimtas iš php6 versijos. o šiaip tai dar gerai yra atjungti ini_get f-ją, kuri leidžia peržiūrėti php nustatymus iš php.ini failo.
March 9th, 2006 at 1:49 am
na norint būti totaliam paranojikui tai galima išjungti ir phpinfo(), ini_set() ir kitas panašias f-cijas. Norint būt piktu paranojiku galima išjungt error_reporting() o lygi reportinimo nustatyt į 2048
May 16th, 2006 at 9:49 am
O nesuprantu, kam uzdrausti tokias funkcijas kaip:
ini_set(), fopen(), readfile(), file() ar galu gale ir init_get()?
del file() stiliaus f-ju yra - open_basedir gi
del safe_mode? Tai yra blogis!
ir ijungus ji netiesa kad viskas veiks korektiskai 

pastebesit dirbdami su uploaded failais
August 30th, 2006 at 4:07 pm
Mano manymu geriausia yra naudoti mod_chroot
January 8th, 2007 at 6:01 pm
Cituoju “laikant katalogus web serverio pasiekiamumo ribose, būtina sudėti index.html failus, kurie būtų bent jau tušti, tokiu būdu neleidžiant matyti katalogo turinio.”
Kiek zinau uztenka ivesti 1 eilute i .htaccess byla.
January 9th, 2007 at 12:51 pm
Ne visur .htaccess palaikomas, būna su įvairiais apribojimais ar dar kas. O vat index.html sukurti tau nieks nesutrukdys