PHP saugumo nustatymai - 1 dalis
Aptikau tokį straipsnelį php|a žurnale, tai nutariau,kad visai pravers pakonspektuot
o ir Jums į naudą išeis.
PHP standartinėje versijoje yra virš 500 INI nustatymų direktyvų. Šis skaičius gali išaugti, jei įdiegsite PECL ar kokių kitų išorinių modulių. Didžioji dalis nustatymų yra palikti veikti standartiškai (default), gali būti, kad jų judinti niekad ir neprireiks. Nenuostabu, kad turbūt nė vienas žmogus šių visų nustatymų negalėtų mintinai mokėti, tačiau yra keletas svarbesnių, susijusių su saugumu, į kuriuos verta atkreipti dėmesį. Pilnas INI nustatymų aprašymas yra čia.
PHP INI nustatymai taipogi turi keletą “nustatomumo lygių”. Kai kurie nustatymai, pavyzdžiui, yra tik “system” tipo, tai reiškia, kad jį galima pakeisti tik php.ini faile, taigi priėjimas prie jo yra draudžiamas ir skriptams, ir web serverio per-virtualaus hosto nustatymus, ir .htaccess failui. INI sąraše tokie nustatymai žymimi “PHP_INI_SYSTEM”.
Kai kurie nustatymai turi “PHP_INI_PERDIR” lygį. Tokiu atveju nustatymas gali būti keičiamas php.ini faile arba web serverio virtualaus hosto nustatymuose, arba jo .htaccess faile. Dažniausiai tokie nustatymai įtakoja pavyzdžiui, vartotojo įvedamus duomenis, o jie yra apdirbami dar prieš startuojant php skriptą, taigi skripto viduje, kad ir pirmoje eilutėje kreipimasis pakeisti nustatymą, neduotų jokio naudingo rezultato.
Didžioji nustatymų dalis patenka į “PHP_INI_ALL”, tai reiškia, kad nustatymas gali būti keičiamas bet kur, t.y. be jau minėtų būdų, dar papildomai ir pačiame skripte per ini_set() funkciją.
Register globals
Neverta apie juos daug aušinti burnos. Tiesiog reikia išjungti ir tiek
Nuo 4.1 versijos išjungti default, tačiau dėl senų skriptų palaikomumo būna daug kur įjungti (ypač shared-hostinge). Šis nustatymas paliečia vartotojų įvedamus duomenis dar prieš vykdant skriptą, todėl jį apdirbti racionaliausia php.ini faile (register_globals=0), virtual host nustatymuose (php_admin_flag register_globals 0) arba .htaccess faile (php_flag register_globals 0). Patikrinti galime per phpinfo() funkciją arba ini_get(”register_globals”).
Magic Quotes
Panašiai gan nemenką žalą darantis nustatymas, kaip ir register globals. “magic_quotes_gpc” nustatymą verta išjungti ne tik dėl saugumo, bet ir dėl tam, kad skriptai būtų vykdomi greičiau - automatinis visų duomenų eskeipinimas taip pat atima resursų, be to, galbūt visai nebūtinas, juk ne visi įvedami duomenys yra naudojami SQL užklausose, be to, magic_quotes veikia ne itin korektiškai, ir vistiek gali palikti spragų saugume. Tai įvedimo apdirbimo nustatymas, taigi jis taip pat yra “PHP_INI_PERDIR” tipo. Dar vienas nustatymas “magic_quotes_runtime” yra panašus, tačiau priešingai nei “magic_quotes_gpc”, yra išjungtas defaultu. Bet kokiu atveju, verta patikrinti, jog abu jie būtų išjungti.
open_basedir
Labai naudingas dalykas shared-hostinge, tam, kad kiti vartotojai, vykdydami skriptus per web serverį, negalėtų landžioti po jūsų failus. Nustatymas keičiamas tik per php.ini failą arba apache virtual hostams. Kadangi atskiriems vartotojams reikia prieiti prie tam tikrų bendrų katalogų ir savo namų katalogo, tai nustatymo keitimas php.ini faile yra beprasmis, reikia diferencijuoti šį parametrą pagal vartotojus. Pvz. php_admin_value open_basedir “/tmp/:/home/user1/”. Reikia atminti, kad būtina katalogą iš abiejų pusių atskirti slashais, nes užrašymas “/home/user1″ leis priėjimą ir prie /home/user1, ir prie /home/user123 ir kitiems katalogams, kurių pradžia būtent tokia, o tai jau yra rimta saugumo spraga.
Safe Mode
Šio nustatymo idėja buvo labai kilni, tačiau pavadinimas gali būti apgaulingas. Safe mode režimas apriboja daug nustatymų susijusių su saugumu, tačiau visus juos galima reguliuoti atskirai ir daug lanksčiau (apie juos kitoje dalyje). Vienas iš svarbiausių dalykų, kad safe mode režime, kai skriptas kreipiasi į failą, tikrinamas skripto savininkas ir failo savininkas. Jei jie sutampa, tuomet operacija leidžiama. Tačiau tokiu būdu galima lengvai prarasti priėjimą prie failų, kurie sukuriami pačių skriptų. Be to, šį apribojimą galima lengvai apeiti su daugeliu funkcijų, pvz. copy(). Nors safe_mode įjungimas ir nekenkia tiesiogiai, tačiau jis sukūria papildomo apkrovimo serveriui, tikrinant failo UID, todėl rekomenduojama išjungti ir protingai suderinti kitus saugumo nustatymus, taip pat atskiriant vartotojus į virtualius hostus bei naudojant gudrias priėjimo teises (chmod).
Expose PHP
expose_php nustatymas įjungtas standartiškai, tačiau nauda iš jo menka, o žala didelė. Įjungimas reiškia, kad kiekvienos užklausos metu siunčiama informacija apie PHP versiją, naudojama serveryje. O tai be abejo naudinga hackeriams, ieškantiems pažeidžiamų senesnių versijų, be to tai yra ir papildomi nereikalingi duomenys, naudojantys saito pralaidumą. Nebūtina visam pasauliui žinoti kokia kalba parašytas tinklapis. Statistikos rinkimui užtenka panaudoti kad ir header(”X-Powered-By: PHP”); kuris nerodo PHP versijos. expose_php nustatymas reguliuojamas tik php.ini faile.
Display Errors
display_errors būna įjungtas default, o tai reiškia, kad visos klaidos bus išvedamos tiesiai į browserį. Be abejo, tokia informacija naudinga norintiems pakenkti. Geriausias variantas yra uždrausti lankytojams matyti klaidas, tačiau leisti programuotojui prie jų prieiti. Klaidų nustatymai gali būti keičiami visuose lygiuose (pačiame PHP skripte - taip pat):
error_reporting(E_ALL | E_STRICT);
ini_set(’display_errors’, 0);
ini_set(’log_errors’, 1);
ini_set(’error_log’, ‘/var/home/user/logs/php.log’);
Pabaiga
Pirmos dalies pabaiga ![]()
January 15th, 2007 at 9:16 am
[...] Pabaiga Pirmos dalies pabaiga Originalus straipsnis čia. Susiję straipsniai:Asmens kodo saugumasEl. pašto injekcijosPHP saugumas antra dalis [...]
January 15th, 2007 at 4:49 pm
liux =] reiks pradet logint.. anksciau apie mail buvau pagalvojes.. visus erorrus mailintu, taciau cia dar geriau