Albert Gaidamovič

PHP saugumas

1.ĮVАDАS

Dirbant internete galimi tokie pavojai: • jūsų kompiuteryje esantys duomenys gali būti pavogti; • į jūsų naudojamas paslaugų paskyras gali būti įsilaužta; • jūsų tapatybė gali būti pasisavinta; • jūs galite būti stebimas trečiųjų asmenų; • jūs galite nukentėti materialiai; • jūsų kompiuteris gali tapti „zombiu“ ir vykdyti atakas prieš kitas sistemas jums nežinant.

Šiame referate aprašysiu kaip reikia saugiai programuoti, populiarią PHP programavimo kalbą. PHP – plačiai paplitusi dinaminė interpretuojama programavimo kalba (en: Hypertext Preprocessor), sukurta 1995 m. ir specialiai pritaikyta interneto svetainių kūrimui. PHP sintaksė panaši į daugelį struktūrinių kalbų, ypač į C bei Perl. PHP kalba yra atviro kodo ir tai yra viena priežasčių, dėl ko kalba yra nors ir nesudėtinga, bet gana lanksti – veikia daugumoje operacinių sistemų, palaiko nemažai reliacinių duomenų bazių bei veikia su dauguma interneto serverių – CGI, FastCGI, ISAPI ir kitais protokolais. Nors PHP yra dažniausiai naudojama interneto puslapių kūrimui, bet yra labai galingas įrankis atlikti kitas funkcijas komandinėje eilutėje.

2.PHP slaptažodžių saugumas

2.1 Saugojimas taip kaip įvedė vartotojas

Įvedus vartotojui savo slaptažodį jis tiesiog išsaugojamas duomenų bazėje tiesiai iš $_POST masyvo. Prisijungimo metu atliekamas palyginimas:

if ($_POST["password"] == $password) {

} else {

}

2.2MD5 hash saugojimas

Į duomenų bazę patalpinama: $hash = md5($_POST["slaptazodis"]);

Prisijungimo metu:

$hash = $vartotojas["hash"]; if (md5($_POST["slaptazodis"]) == $hash) {

} else {

}

Tačiau MD5 hash funkcija nebėra saugi! Ji yra labai greita ir su šiuolaikinėmis vaizdo plokštėmis galima išbandyti labai daug slaptažodžių itin greitai. Taip pat visos MD5 reikšmės jau suskaičiuotos ir galima atlikti paprastą patikrinimą lentelėje norint sužinoti slaptažodį. Šis metodas yra ne ką saugesnis nei saugojant slaptažodį tokį patį kaip įvedė vartotojas! Naudojant šį būdą jūs rizikuojate savo reputacija.

2.3 SHA1 hash saugojimas

2.4 Saugojimas naudojant PHP5.5

programuotojo darbą. Jos savyje turi pačias naujausias saugumo praktikas. Naudojant šį metodą net ir praradus duomenų bazę jūsų vartotojų slaptažodžiai išliks saugūs. Įsilaužimo atveju jūsų reputacija bus pažeista, tačiau pataisoma.

Slaptažodžio saugojimas

$hash = password_hash($_POST["slaptazodis"], PASSWORD_DEFAULT);

Slaptažodžio patikrinimas:

$hash = $vartotojas["hash"]; if (password_verify($_POST["slaptazodis"], $hash)) {

} else {

}

password_hash() funkcijai perduodamas PASSWORD_DEFAULT parametras nurodo, kad naudoti bcrypt kriptografinį algoritmą. bcrypt buvo sukurtas dabar Google dirbančio Niels Provos ir paremtas Blowfish šifru. bcrypt priklauso "key derivation" funkcijoms ir yra skirtas saugoti slaptažodžiams.

Bcrypt rezultatas atrodo šitaip: "$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a" Pradžioje esantis "$2y$10$" nurodo bcrypt versiją ($2y) ir cost ($10$). Cost nurodo kiek kartų reikia kartoti funkciją (10 reiškia kartoti 2^10 kartų).

Rekomenduojama parinkti cost parametrą tokį, kad vieno bcrypt rezultato gavimas jūsų serveryje užtruktų 100 ms. Surasti tinkamą cost parametrą galite šitaip:

<?php $timeTarget = 0.1; // 100 milliseconds

$cost = 8; do {

} while (($end - $start) < $timeTarget);

echo "Cost parametras: " . $cost . "\n"; ?>

Perduoti cost parametrą:

$hash = password_hash($_POST["slaptazodis"], PASSWORD_BCRYPT, array("cost" => 10));

2.5 Vartotojų identifikacija naudojant Laravel 4.2

Jei esate Laravel framework naudotojas saugus vartotojų valdymas yra itin paprastas. Slaptažodžio saugojimas:

$password = Hash::make(Input::get('slaptazodis'));

Vartotojo prisijungimas:

$username = Input::get('vartotojas'); $password = Input::get('slaptazodis'); if (Auth::attempt(array('username' => $username, 'password' => $password))) {

} else {

}

2.6 Kiti būdai

3.Nesaugios PHP funkcijos

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. 4.Failų apsaugojimas

Pasinaudoti minėtomis saugumo spragomis net nebūtina spėlioti - pakanka pateikti tinkamas užklausas googlui.

5.PHP kintamųjų saugumas

Kuriant visuomet įsijunkite pilną klaidų rodymą, kuris leis pamatyti apie neaprašytus kintamuosius: error_reporting(2047) Serverio nustatymuose išjunkite register globals, kurie neleis kintamųjų inicializuoti per get/post parametrus. Jei to nepadarysite, gali būti tokia situacija: //kažkas pradžioje if ($_POST[‘user’] == ‘adminas’ && $_POST[‘passwd’] == ‘admino_slaptazodis’) {

} if ($prisijunges) {

} // kažkas gale Vartotojas gali perduoti kintamąjį $prisijungęs GET metodu, naršyklėje įvedęs ’skriptas.php?prisijunges=1′ ir taip matys prisijungusiojo turinį. Kitose situacijose, galima įterpti ne Programuojant būtina rašyti viską tvarkingai. Tai ne tik svarbu dėl to, kad programa turi gražiai atrodyti (pvz.PEAR Coding Standards), bet ir teisingai pavadinti kintamieji. Jei jūs kintamąjį pavadinsite kokiu $xxx, tai garantuoju po mėnesio nei jūs, nei jūsų kolegos greitai negalės prisiminti, ką jis savyje laiko. Daug teisingiau naudoti suprantamus pavadinimus, kad ir $kaina, $pavadinimas, $prekes. Bet viskas atrodys dar gražiau ir bus patogiau, jei pirmąjį kintamojo simbolį paskirsite aprašyti duomenų tipui. Tad, kai reikės jį panaudoti iškart žinosite, kas turi jame būti. Pavyzdžiui: $iMetai = 2015; // integer $sPavadinimas = “AJAX”; // string $aPrekes = array(1,2,3); // array $oMail = new MailClass; // objektas $fKaina = 555.95 // float Kaip minėjau šiek tiek anksčiau, duomenimis iš vartotojo reikia kuo mažiau pasitikėti. Visų pirma reiktų išjungti galvos skausmą magic_quotes, kuri uždeda stebuklingus simbolius ant kabučių ir pan. Jei negalite keisti serverio nustatymų - pasinaudokite šiuo kodo gabaliuku, kurį reiktų įdiegti pačioje pradžioje. if (get_magic_quotes_gpc()) {

} Prieš dirbant su kintamaisiais nepamirškite apdoroti jų, nes juk vartotojas gali juos pakeisti savo nuožiūra, o ne vaikščioti per nuorodas. Tad būtina patikrinti duomenis taip, kad galimos reikšmės būtų tik tos, kurios yra galimos. Sutikite, perkant e-shop’e prekių kiekis negali būti neigiamas, tiesa? if (isset($_GET[‘news_id’]) && is_numeric($_GET[‘news_id’])) {

} Patarčiau nenaudoti tokio tipo apsisaugojimo, kurį padarė valstybinio puslapio programuotojai po jų svetainės patikrinimo per saugumo konferenciją. Su (int) jie pavertė kintamąjį į integer tipą, bet ši svetainė vis vien liko pažeidžiama XSS tipo atakomis. $aNewsData = $db->getRow(“SELECT * from naujienos where id=’”. (int)$_GET[‘news_id’] .“‘”); if ($aNewsData) {

} else {

} PHP validacijai/apdorojimui turi ne vieną: is_array, is_numeric, is_bool, is_object, is_string,

6.Išvados

• Vartotojas nežino kaip veikia programa, nežino ką žinot jūs, jis gali atlikti veiksmus tokius, dėl kurių vėliau programa atliks neįtikėtinus veiksmus. • Vartotojas gali stengtis ieškoti klaidų ir panaudoti tai savo tikslams. • Internetas ne visuomet gerai veikia. Tai jis per lėtas, tai nenusiunčiami visi paketai, dėl to jūsų programinis kodas gali veikti neįtikėtinai keistai. • Pati programavimo kalba gali turėti klaidų apie kurias jūs net nežinote, o jei žinote ir naudojat per senas PHP versijas galite nukentėti ir dėl to.

Ir dar kiti neįtikėtini veiksniai, kurie nepriklauso nuo jūsų bei jūsų įpročių. Niekas negimė mokėdamas. Blogiausia, kad turbūt visi mes mokomės iš savo klaidų. Yra tikras menas išmokti mokytis iš kitų klaidų arba atradimų.

7. LITERATŪRA

1. http://www.esaugumas.lt/lt/saugus-darbas-internete.html 2. http://lt.wikipedia.org/wiki/PHP 3. http://pixel.lt/php-saugumas-saugus-programinis-kodas-1-dalis.html 4. http://pixel.lt/php-saugumas-saugus-programinis-kodas-2-dalis.html 5. https://uzdarbis.lt/t323788/php-slaptazodziu-saugumas


CategoryHomepage

paskutinį kartą redaguota 2015-04-28 12:31:45 redaktoriaus Albert