Logovanje - cookies i sessions

1

Logovanje - cookies i sessions

offline
  • Pridružio: 20 Dec 2004
  • Poruke: 2887
  • Gde živiš: Na Balkanu

Hoću da napravim logovanje na sajtu.
Googlam od sinoć za tutorijalima i sve što mogu da nađem je postavljanje cookies-a, koji pamti neke osnovne podatke, kao kad je korisnik poslednji put posetio stranicu i sl. OK, to je početak, ali meni treba više od toga.

Meni treba neki tutorijal koji će mi objasniti kako da postavim cookies koji će služiti da se korisnik ne mora prijavljivati na sajt svaki put.

Da li znate neki tutorijal ili možda neko može ukratko da objasni da bih znao šta da tražim?

i

Kakva je uloga sesija u svemu tome?



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Blood  Male
  • Ugledni građanin
  • Pridružio: 26 Jul 2003
  • Poruke: 384
  • Gde živiš: Beograd

Ja cu ti objasniti to, samo sada nemam vremena, eto me za 2-3 sata sa objasnjenjem...

Pozdrav!



offline
  • Pridružio: 20 Dec 2004
  • Poruke: 2887
  • Gde živiš: Na Balkanu

OK čekam.

Samo ne treba mi objašnjenje kako poslati cookies i kako čitati podatke.
Hoću da znam šta da šaljem, da li mi treba neki ključ, koji ću pamtiti u bazi i kasnije upoređivati.
Kako da izvršim proveru ispravnosti?

offline
  • Blood  Male
  • Ugledni građanin
  • Pridružio: 26 Jul 2003
  • Poruke: 384
  • Gde živiš: Beograd

Izvini sto se ranije nisam javio, imao sam posla.

Evo detaljnog objasnjenja, prvo cu ti postovati ti objasniti uopsten princip kako se to radi, pa cu ti onda postovati kod koji sam napravio pre dosta vremena, koji i dan danas koristim u svojim aplikacijama pa cu ga onda detaljno i objasniti.

Prvo moras da iskonstruises bazu. U bazi ces cuvati podatke onoga preko cega zelis da vrsis proveru(username, password, mail, itd itd). ja cu za primer uzeti usernam i password posto je najcesce koriceno po netu.

Znaci baza bi imala polja uid, uname, pass

Drugo sta ti je potrebno je da napravis login formu(to ne moram da objasnjavam - ako ipak moram, reci pa cu naknadno objasniti)

Sledece sta je potrebno je da napravis neku f-ju koaj ce proveravati da li su podaci unetu u tu formu ispravni

i na kraju ti treba login i logout stranica(moze jedna za oboje)

Sada, kad sam ti rekao sta je sve potrebno, ajde da se bacimo na kod.

ZNaci kada neko upise svoj uname i pass u formu, bacas ga na login.php stranicu koja izgleda ovako nekako:
if(isLoggedIn()) {    header("Location: index.php"); } else {    // if typed username and password, checking with database if typed user exist //    if($_POST['submit'] == 'Login!') {          $res = mysql_query("SELECT `uid` FROM `users` WHERE `uname`='".$_POST['uname']."' AND `pass`='".$_POST['pass']."';") or die(mysql_error());          $row = mysql_num_rows($res);          if ($row == 1) {             setcookie('name', $_POST['name'], time()+86400, '/');             setcookie('pass', $_POST['pass'], time()+86400, '/');             header("Location: index.php");          } else {             // if username or password are wrong, displaying error message //             alert('<p>Wrong username or password!</p>');             echo parseTemplate("login.tpl");          }    } else {    echo parseTemplate("login.tpl");    } }
eh sada, objasnjenje ovog koda.

if(isLoggedIn()) {} proverava da li postoje upisani cookie sa usernameom i passwordom i ako postoje, da li oni postoje u bazi - to je ujedno i f-ja o kojoj sam pricao ranije, njen kod cu postaviti posle, ako ne postoje, parsuje se template sa login formom(ti umesto moje f-je za parse template mozes staviti html kod ili mozes koristiti svoj neki template system), ako postoje, redirektuje ga na index.php. e sada, ako je neko vec prosao ovaj deo proveravanja, i pokazala mu se forma za login i ukucao podatke za login, onda se izvrsava onaj deo koda if($_POST['Login']) {} to znaci da je neko kliknuo da dugme sa imenom Login. i onda se vrsi provera u bazi da li taj korisnik postoji, ako postoji, u cookie-e se upisuju vrednosti za username i password(ovo nije bas najsigurnija varijanta, kasnije cu obajsniti kako napraviti sigurniju varijantu od ovog primera ili kako napraviti na drugi nacin login system) i korisnik se redirektuje na index.php a ako ne poziva se f-ja alert koja je u stvari obicna variabla gde ispisuje da je pogresan username i password zajedno sa stranicom gde je login forma.

time()+86400 je vreme koliko ce cookie trajati i ujedno koliko dugo korisnik nece morati ponovo da se loguje. 86400 je jedan dan.

eh sada, sada nam treba kod za f-ju isLoggedIn(), a on izgleda ovako:
function isLoggedIn() {    $res = mysql_query("SELECT `uid` FROM `users` WHERE `uname`='".$_COOKIE['name']."' AND `pass`='".$_COOKIE['pass']."';") or die(mysql_error());    $row = mysql_num_rows($res);    mysql_free_result($res);    return ($row == 1) ? true : false; }
Znaci on proverava kao sto sam vec rekao da li je u cookie upisan username i password i da li se to sto je upisano u cookie poklapa sa onim sto je upisano u bazu. Ako jeste f-ju vraca true, ako nije vraca false.

Sada kada smo i to objasnili, ostaje da objasnim logout.php i index.php

index.php je vrlo jednostavan.
if(isLoggedIn()) { // ovde ide dozvoljeni sadrzaj } else { header("Location: login.php"); }

mislim da je ovo sasvim jasno

i logout je kod koji brise cookie:
setcookie('name', '', time()-86400, '/'); setcookie('pass', '', time()-86400, '/'); header("Location: login.php");

E sada, ovaj kod nije narocito siguran jer nije zasticen od sql injections-a, tutorijal kako da se zastitis mozes da nadjes na mom blogu, isto tako nije siguran jer cuvas vazne podatke u cookie-u, ali oni mogu da se kriptuju ili hashuju pa ni to nije problem, drugi nacin kako moze da se napravi login je da podatke cuvas u session-u, ali onda ti je user ulogovan samo dok surfa, posle toga nije.

Za pravljenje ovih login-a postoji milion nacina, ja sam ti jedan detaljno objasnio, a drugi ti nagovestio kako da ga napravis.

Ako te jos nesto zanima, slobodno pitaj.

Pozdrav!

offline
  • Pridružio: 20 Dec 2004
  • Poruke: 2887
  • Gde živiš: Na Balkanu

Hvala.

Mislim da ću preskočiti čuvanje passworda unutar cookies i da ću u tabelu ubaciti kolonu key koja bi trebala da bude string od recimo 10 znakova i menjaće se svaki put kad korisnik koristi obrazac za prijavu.

Da li će ovo pomoći sigurnosti?

offline
  • Blood  Male
  • Ugledni građanin
  • Pridružio: 26 Jul 2003
  • Poruke: 384
  • Gde živiš: Beograd

nisam siguran da razumem sta hoces, ali mozes da cuvas passworde u cookie, samo ih hashuj ili uz pomoc md5 ili uz pomoc sha, samo onda imas malo drugaciji problem, kad neko izgubi password ne mozes da mu das, vec moras da ga resetujes i da mu ga posaljes na mail, i u bazi naravno moras da cuvas tu hashovanu verziju(ovo ja korsitim)..

Pozdrav!

offline
  • Pridružio: 20 Dec 2004
  • Poruke: 2887
  • Gde živiš: Na Balkanu

Zašto obadve ne bi čuvao u bazi i orginalnu i hashovanu?

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Zato sto rizikujes sigurnost korisnika ukoliko ti baza bude "provaljena", tj. neko pokupi passworde.
Generalno (kada je sigurnost u pitanju), ne treb cuvati passworde u bazi, vec samo hasheve.

offline
  • Blood  Male
  • Ugledni građanin
  • Pridružio: 26 Jul 2003
  • Poruke: 384
  • Gde živiš: Beograd

dobio si odgovor.. Smile

offline
  • Pridružio: 20 Dec 2004
  • Poruke: 2887
  • Gde živiš: Na Balkanu

Još dva pitanja.

Ako lozinku kriptujem sa md5, takvu je spasim u bazi i posle šaljemu unutar cookia, da li postoji mogućnost da neko enkriptuje lozinku?

Zar addslashes() nije dovoljno kao zaštita od sql injections-a?

Dopuna: 20 Dec 2006 5:58

Našao sam odgovor na prvo pitanje i dok sa tražio video sam koliko su ljudi glupi.

Na internetu postoji nekoliko baza podataka sa pročitanim md5 lozinkama.
Kako to rade? Jednostavno napravili su sajtove na kojima nude kreiranje md5 lozinki i sad neko ko ne zna hoće da ima "md5 lozinku" i ukuca svoju lozinku, ali oni sve to pamte u bazu. Naravno većina ljudi nikad neće ni koristiti encriptovanu lozinku jer je predugačka već će nastaviti sa strom.

Ko je trenutno na forumu
 

Ukupno su 527 korisnika na forumu :: 4 registrovanih, 1 sakriven i 522 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: darios, draganl, gorantrojka, Tas011