Kažkada ir aš buvau jaunas, nepatyręs programuotojas. Geriausias būdas išmokti , tai pradėti programuoti šia kalba. Taigi, aš nusprendžiau sukurti nedidelę sistemėlę. Be abejonės, man reikėjo administravimo dalies, o koks administravimas be autorizavimo? Tuo metu iš interneto parsisiunčiau 10 skirtingų pavyzdžių, kuriuose buvo realizuotas autorizavimo principas. Deja, iš 10 veikė tik 2, iš kurių pasirinkau vieną, net nesusimąstydamas naudojau ilgą laiką. Sesijos man tuomet buvo kažkas iš anapus. Dabar pabandysiu paaiškinti - kas, kaip ir kodėl.

prasideda nuo html formos, bet čia ne dizaino pamokos, todėl pateiksiu tik esminius griaučius, kurie bus patalpinti login1. faile.

<form name="login" action="login2.php" method="post">
<label for="nickname">Vardas:</label><input type="text" name="nickname"  /><br />
<label for="password">Slapta&#382;odis:</label><input type="password" name="password" /><br />
<input type="submit" class="submit" value="Prisijungti" />
</form>

Jau turime prisijungimo lango griaučius, todėl galime parašyti kodą, kuris aptarnaus tą formą.

<?php
/* Patikriname, ar sesija išsaugota cookie formate, jeigu taip, tuomet patikriname ar sesija yra sudaryta iš skaičių ir alfabeto, jeigu ne, ištrinam šios sesijos cookie */
if( isset($_COOKIE[session_name()]) && !ctype_alnum($_COOKIE[session_name()]) ){
    unset($_COOKIE[session_name()]);
}       
session_start(); // Pradedame sesiją
$user = ( isset($_POST['nickname']) && trim($_POST['nickname']) != "" ) ? $_POST['nickname'] : false; // Patikriname, ar vartotojo vardas apskritai nustatytas, nėra tuščias ir nėra tarpas, jeigu kažkas negerai - vartotojo vardas yra neteisingas (false)
$password =  ( isset($_POST['password']) && !empty($_POST['password']) ) ? md5($_POST['password']) : false; // Patikriname, ar slaptažodis apskritai yra nustatytas, ar nėra tuščias (tarpas gali būti), jeigu kažkas negerai - slaptažodis yra neteisingas (false)
 
/* patikriname ar nors vienas iš suteiktų duomenų nėra neteisingas (false) */
if (!$user || !$password) { 
   echo ("Prašome teisingai įvesti prisijungimo duomenis");
   include("login1.php"); // Įterpiame login laukus iš naujo */
   exit;
}
 
/******************
Čia gali būti paimami duomenys iš duomenų bazės arba tiesiog statiškai nustatomi
******************/
$ispassword="21232f297a57a5a743894a0e4a801fc3";
$isuser="admin";
/* Patikriname ar duomenys sutampa */
if($isuser == $user && $ispassword == $password)
{
      $_SESSION['user'] = $user; // Priskiriame sesijos kintamajam vartotojo vardą
      header("Location: login3.php");
} else {
  echo ("Slaptažodis arba vartotojo vardas yra neteisingi");
  include("login1.php"); 
  exit;
}
 
?>

http://pixel.paste.lt/paste/c2b96865342f70761a1323c0bccc6b13
Dabar pabandysiu paaiškinti kas vyskta.
Pradėsime nuo saugumo klausimų. Labai svarbu, kad sesijos vardas būtų sudarytas tik iš raidžių ir skaičių, priešingu atveju, kai sesija saugoma failų sistemoje (pagal nutylėjimą), turės problemų išsaugant sesiją (rodys klaidas). Jeigu viskas gerai, tuomet sekanti komanda session_start() - startuoja sesija.
Sekančiose eilutėse iš $_POST masyvo išimami duomenys ir atliekama duomenų kontrolė. Tas eilutes reikėtų skaityti taip:

if($nickname buvo įvestas IR jis nėra tarpas)
$user= $_POST['nickname']
else kintamasis neteisingas

Analogiškai patikrinamas slaptažodis, tačiau slaptažodis gali būti 5 tarpai, tuo tarpu vartotojo vardas negali turėti nei vieno tarpo.
Norėčiau atkreipti dėmesį, jog aš nesivarginu tikrinti, ko konkrečiai neįvedė vartotojas, vartotojo draugiškumo etiketas reikalautų pasakyti kas ne taip, bet saugumo - nesakyti. Šiuo atveju čia nėra nieko bendro su saugumu, tačiau jeigu jūs parodytumėte pranešimą “slaptažodis neteisingas”, programišius iš karto suprastų, jog atspėjo vartotojo vardą - pusę darbo padaryta, beliko atspėti tik slaptažodį.
Kadangi tai paprastas , tai aš patingėjau kurti duomenų bazę ir paprasčiausiai apsirašiau kintamuosius kode, tikiuosi jūs sugebėsite susikurti savo duomenų bazę ir iš jos pasiimti duomenis. Tačiau nepamirškit apie atsirandančią galimybę SQL injekcijai. Čia galima naudoti: mysql_escape_string, mysql_real_escape_string.
Norėčiau atkreipti dėmesį, jog slaptažodis koduojamas MD5, šiuo atveju man nusišvilpt dėl saugumo, manyčiau, jog programuotojas privalo gerbti žmogaus privatumą ir neleisti niekam bei pats nežiūrėti vartotojų slaptažodžių.
Kai patikrinate ir matote, jog toks vartotojas su būtent tokiu slaptažodžiu egzistuoja sesijoje užregistruojate reikiamus kintamuosius. Sesijoje rekomenduočiau saugoti duomenis, kurie nesikeičia dažnai. Duomenis, kurie keičiasi reikėtų saugoti duomenų bazėje, nes uždarius langą duomenys dings.
Header(”Location: login3.“) komanda peradresuoja visą veiksmą į kitą failą.
Pažiūrėkime koks login3. failo turinys.

<?php
/* Patikriname ar sesija išsaugota cookie formate, jeigu taip patikriname ar sesija yra sudaryta iš skaičių ir alfabeto, jeigu ne tuomet ištrinam šios sesijos cookie */
if( isset($_COOKIE[session_name()]) && !ctype_alnum($_COOKIE[session_name()]) ){
        unset($_COOKIE[session_name()]);
}
session_start(); 
if(!isset($_SESSION['user']))
{
        include("login1.php");
        exit;
}
/* Atsijungimo veiksmas */
if(isset($_GET["ac"]) && $_GET['ac'] == "out")
{       
        session_unset();
        session_destroy();
        include("login1.php");
        exit;
}
?>
Tekstas, kuris matomas tik prisijungusiems vartotojams, jei norit atsijungti, spauskite "<a href="login3.php?ac=out">Atsijungti</a>"

http://pixel.paste.lt/paste/e52c5a8ea16ac4c951d55509aebc071b
Pirmosios eilutės kartojasi ir jos kartosis visuose failuose, kuriais leisite naudotis tik prisijungusiems vartotojams. Tada patikrinama, ar tikrai yra ta sesija ir ar užregistruoti reikiami kintamieji.
Toliau yra gabaliukas skirtas aptarnauti atsijungimui. Atsijungimo metu sunaikinama sesija.
Pabaigoje atspausdinama atsijungimui skirta nuoroda. Čia pavyzdys be jokių HTML žymių, juk ne to susirinkome mokytis.

Tai tiek norėjau parodyti šį kartą, stengiausi viską padaryti kiek galima paprasčiau, kad suprastų pradedantieji. Sesijos skirtos saugoti kintamiesiams, kuriuos reikia dažnai jūsų sistemoje naudoti, tačiau nereikia atnaujinti. Sesijos taip pat gali būti naudojamos prekių krepšeliui realizuoti virtualiose parduotuvėse.
Parsisiųsti sukurtą prisijungimo kodą.

Panašūs straipsniai


“Paprastas prisijungimas” komentarų: 9

  1. asterisk

    Turiu pastebėjimą - sesiją patartina pririšti prie IP, kadangi jeigu kam nors netyčia pavyktų pavogti sesijos ID, jis galėtų prisijungti prie sistemos.

  2. Sergej Kurakin

    Bent paskutiniose PHP versijuose SessionID yra patikrinamas, ar jis atitinka panasia taisikle.

    O jai jus kamuoja paranuoja, tada tikrinkite ir session_name, paskutini karta net per ja sugebejo XSS ikishti.

  3. Sergej Kurakin

    Šeip, nekada negalvojau, kad paveikus $_COOKIE masyva prieš session_start(), galima įtakuoti SessionID.

    Ačiū NePo, priverte pažiureti į PHP source kodus ir pasižiurėti kaip tai padaritą. Pasirodo, Session extension išnaudoja $_GET, $_POST ir $_COOKIE superglobasius masivus SessionID paieškai. Kadangi šie masivai nera tik skaitimui (read only) įmanomas SessionID manipuliavimas tieisai iš PHP kodo. Tada, tesiant paranoja (idomu, iki kurios versijos ja butina naudotis) reikia valiti ir $_GET ir $_POST masyvus.

  4. asterisk

    Taip, jeigu esi tikrai labai susirūpinęs saugumu (o tai tikrai sveika), reiktų pravalidatinti visus global`us.

  5. kernas

    Toje vietoje kur “nusišvilpt dėl saugumo”, nesupratau kodel cia tau taip nusisvilpti.. (kodel taip yra nesaugiau).
    Beje galetu buti ir daugiau tokiu paaiskinimu, kodel geriau daryti ta ar ta, kaip kad “jeigu jūs parodytumėte..” (paskutine pastaba/noras/svajone tikriausiai skirta visiems patarimams pasaulyje :) )

  6. Emilis

    Pirmam sakiny klaida.

  7. asterisk

    Emili, gal gali konkrečiau ? :)

  8. NePo

    kernas> nesakiau, kad taip yra nesaugiau:)
    tiek md5, tiek sha1 yra nulauzti, taip kad norit saugiai saugoti slaptažodžisu reikia galvoti ką nors papildomo md5(sha1($slaptazodis)) ? Apie saugumą daug rašė kolegos, tiesiog pasižiūrėk ką jie siūlo.

  9. NightVision

    Username ir password geriau tikrink su trigubu lygu `===`. Apie tai mano straipsnis guli čia:
    http://miracle.gamedev.lt/index.php?n=modules/forum&a=3&d=2&o=3&q=4

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.