tomaac Posted February 3, 2011 Report Share Posted February 3, 2011 Vai idejiski pareizi šādi pārbaudīt vai lietotājs ir ielogojies: Logojoties uzstāda sesiju: $_SESSION["hash"] = md5(session_id()); Kad vajaga pārbaudīt vai ielogojies (index.php lapas augšā vai vēl kaut kur): session_start(); if (isset($_SESSION['hash']) && $_SESSION['hash'] == md5(session_id())) { $is_loged = 1; } else { $is_loged = 0; } Quote Link to comment Share on other sites More sharing options...
labaiss Posted February 3, 2011 Report Share Posted February 3, 2011 (edited) isset - šitas nesanāk lieks? jo ja session nesakritīs..., tad jau tā pat būs FALSE un md5(session_id()), jau nevajadzētu būt tukšam - iespējams + kā tas session_id tike ģenerēts? tas katram lietotājam ir unikāls? vai pie katras ielogošanās tiek ģenerēts unikāls? Edited February 3, 2011 by labaiss Quote Link to comment Share on other sites More sharing options...
mounkuls Posted February 3, 2011 Report Share Posted February 3, 2011 (edited) Idejiski lietotājs parasti ielogojas ar username/e-mail un password.... Ja uzseto session_id no tiem datiem, tad jau jā, nav ne vainas. Tikai protams pirms piešķirt to sesijas id vajadzētu pārbaudīt vai tāds lietotājs ir reģistrēts. Jeb tas nav aktuāli? Edited February 3, 2011 by mounkuls Quote Link to comment Share on other sites More sharing options...
marcis Posted February 3, 2011 Report Share Posted February 3, 2011 No tādas pārbaudes nav pilnīgi nekādas jēgas. Quote Link to comment Share on other sites More sharing options...
Faks Posted February 3, 2011 Report Share Posted February 3, 2011 (edited) nu ka šeit raksta piekrītu ka jēgas nau bet ja raksta ar mysql un sessijas parbaudi kopa tad gan var jēgu gūt ja vēlas limitēt cik lietotājs reizes ielogojas :) ari visas pārbaudes var realizēt paceļam :) ! Edited February 3, 2011 by Faks Quote Link to comment Share on other sites More sharing options...
codez Posted February 3, 2011 Report Share Posted February 3, 2011 (edited) ielogojoties uzstādam $_SESSION["ielogojies_kaa_useris_ar_id"] = $userid; //$userid dabūnam no tabulas, kurā pārbaudam username un password pie pārbaudes: session_start(); if (isset($_SESSION['ielogojies_kaa_useris_ar_id'])) { $is_logged = 1; } else { $is_logged = 0; } Edited February 3, 2011 by codez Quote Link to comment Share on other sites More sharing options...
EdgarsK Posted February 3, 2011 Report Share Posted February 3, 2011 (edited) +1 mārcim, session_id() mainās ik pēc brītiņa, sanāk tev lietotājs pat aktīvi darojoties automātiski tiktu izmests atpakaļ pie login. Nēesmu pētijis vai tas ir kaut kāds php.ini settings, bet praksē tā ir bijis. Lūk neliels paraugs kā es uzskatu būtu jāstrādā autorizācijai: <?php $key = md5('key2'); if(isset($_SESSION[$key])){ $key2 = md5('key1'); if(isset($_SESSION[$key2])){ $UserId = $_SESSION[$key2] - $_SESSION[$key] - 100; if($UserId > 0){ $Query = mysql_query("select `username` from `users` where `id`='{$UserId}'"); if(mysql_num_rows($Query)){ define('UID',$UserId); define('USERNAME',mysql_fetch_object($Query)->username); }else{ unset($_SESSION[$key]); unset($_SESSION[$key2]); } }else{ unset($_SESSION[$key]); unset($_SESSION[$key2]); } }else{ unset($_SESSION[$key]); } } if(!defined('UID')&&isset($_POST['submit'])){ $username = isset($_POST['username'])?mysql_escape_string(strip_tags($_POST['username'])):false; $password = isset($_POST['password'])?sha1($_POST['password'].'_strong_'.$_POST['username']):false; if($username && $password){ $Query = mysql_query("select `id` from `users` where `username`='{$username}' and `password`='{$password}'"); if(mysql_num_rows($Query)){ $UserId = mysql_fetch_object($Query)->id; $hash = md5('key1'); $hashkey = md5('key2'); $_SESSION[$hashkey] = time(); $_SESSION[$hash] = $_SESSION[$hashkey] + $UserId + 100; Header("Location: /index.php"); exit; } } } if(DEFINED('UID')){ echo "Hello ".USERNAME; }else{ ?> <form method="post"> <input type="text" name="username"> <input type="password" name="password"> <input type="submit" name="submit"> </form> <?php } ?> Edited February 3, 2011 by EdgarsK Quote Link to comment Share on other sites More sharing options...
tomaac Posted February 3, 2011 Author Report Share Posted February 3, 2011 (edited) Kad lietotājs raksta username/password, man ir pārbaude - vai tads lietotājs eksistē u.tml. un tad, ja datu baazee ir tieshi viens tāds lietotājs, tad uzliek šo $_SESSION["hash"] = md5(session_id()); (nezinu kur, bet kaut kur tādu izrakstu). Tad attiecīgi index.php faila sākumā man ir tas session_start un pārbaude vai ir uzstādīta sesija (if (isset($_SESSION['hash']) && $_SESSION['hash'] == md5(session_id())). isset lietoju, citādi rāda Notice, ka nav tāds $_SESSION['hash'] Nesapratu īsti, kādēļ tas nav pareizi... (tādā ziņā viss strādā, bet varbūt nesaprotu ko...) R. Edited February 3, 2011 by tomaac Quote Link to comment Share on other sites More sharing options...
codez Posted February 3, 2011 Report Share Posted February 3, 2011 EdgarsK, vari apskaidrot kāda ir tā ģeniālā domā, mēģināt userid noslēpt starp mistiskas atslēgas SESSION mainīgajiem, ja pie ielogošanās var vienkārši definēt: $_SESSION['uid']=$row['uid']; Quote Link to comment Share on other sites More sharing options...
mounkuls Posted February 3, 2011 Report Share Posted February 3, 2011 session_id() mainās ik pēc brītiņa, sanāk tev lietotājs pat aktīvi darojoties automātiski tiktu izmests atpakaļ pie login. Nav novērots. Tas varbūt lietojot kādu Opera Turbo tā varētu sanākt, kad bombardē ar uzreiz vairākiem pieprasījumiem mēģinot panākt ātrāku darbību pārlūkam, bet savādāk nezinu. Quote Link to comment Share on other sites More sharing options...
codez Posted February 3, 2011 Report Share Posted February 3, 2011 (edited) EdgarsK, tu nevari manā serverī nomainīt sesijas datus (tos, kas $_SESSION masīvā). Ātri uzmetot, bez nekādiem framworkiem un bibliotēkām, lietotāju autorizācijas vienkāršs variants varētu būt šāds: <?php session_start(); $db=new mysqli('localhost','root','','test'); //pārbaudām vai sesijā ir definēts kāds uid, kas nozīmētu, ka lietotājs ir ielogojies if (isset($_SESSION['uid'])){ $uid=$_SESSION['uid']; $uun=$_SESSION['uun']; } else { $uid=0; } //ja ir posts ar login formu, pārbaudām vai parole pareiza un piešķiram sesijas mainīgajam uid jaunā ielogotā lietotāja id if (isset($_POST['login'], $_POST['un'], $_POST['psw'])){ $un=$db->real_escape_string($_POST['un']); $psw=$db->real_escape_string($_POST['psw']); $res=$db->query("SELECT * FROM users WHERE un='$un' and psw='$psw'"); if ($row=$res->fetch_assoc()){ $uid=$row['id']; $uun=$row['un']; $_SESSION['uid']=$uid; $_SESSION['uun']=$uun; } else { $uid=0; $wrong_psw=1; } } //ja ir posts ar logout, tad izdzēšam sesijas mainīgo uid, kas nozīmēs, ka neviens lietotājs nav ielogojies if (isset($_POST['logout'])){ $uid=0; unset($_SESSION['uid']); } //attēlojam vai nu lietotāja datus, ja tas ir ielogojies vai arī login formu, ja nav if ($uid) { ?> Hi, <?php echo $uun; ?><br /> Your id is <?php echo $uid; ?><br /> <form method="post"> <input type="submit" name="logout" value="logout"/> </form> <?php } else { ?> <?php if (isset($wrong_psw)) {echo 'Wrong password<br />';} ?> <form method="post"> <input type="text" name="un" /><br /> <input type="password" name="psw" /><br /> <input type="submit" name="login" value="login"/> </form> <?php } ?> Edited February 3, 2011 by codez Quote Link to comment Share on other sites More sharing options...
briedis Posted February 3, 2011 Report Share Posted February 3, 2011 codez, tu savā lapā liktu autorizācijas pārbaudi $_SESSION['uid'] = 1 ? es atvēršu session manager un nomainīšu to vērtību. Tak ir jābūt kaut minimālai izdomai kā glabāt to numuru tā, lai pie tā netiek tik viegli. lulz? Kas tas tāds session manager? Sesijas dati glabājas uz servera, nevis pie lietotāja! Quote Link to comment Share on other sites More sharing options...
codez Posted February 3, 2011 Report Share Posted February 3, 2011 (edited) Ja izmanto to, ka sessions smuki māk glabāt arī sarežģītākas struktūras, tad var sesijā zem 'user' glabāt arī visu no db nolasīto user rindu. Tad kods izskatās pat vēl nedaudz vienkāršāks: <?php session_start(); $db=new mysqli('localhost','root','','test'); if (isset($_SESSION['user'])){ $user=$_SESSION['user']; } else { $user=False; } if (isset($_POST['login'], $_POST['un'], $_POST['psw'])){ $un=$db->real_escape_string($_POST['un']); $psw=$db->real_escape_string($_POST['psw']); $res=$db->query("SELECT * FROM users WHERE un='$un' and psw='$psw'"); if ($user=$res->fetch_assoc()){ $_SESSION['user']=$user; } else { $wrong_psw=1; } } if (isset($_POST['logout'])){ $user=False; unset($_SESSION['user']); } if ($user) { ?> Hi, <?php echo $user['un']; ?><br /> Your id is <?php echo $user['id']; ?><br /> <form method="post"> <input type="submit" name="logout" value="logout"/> </form> <?php } else { ?> <?php if (isset($wrong_psw)) {echo 'Wrong password<br />';} ?> <form method="post"> <input type="text" name="un" /><br /> <input type="password" name="psw" /><br /> <input type="submit" name="login" value="login"/> </form> <?php } ?> Edited February 3, 2011 by codez Quote Link to comment Share on other sites More sharing options...
mounkuls Posted February 3, 2011 Report Share Posted February 3, 2011 rāmāk, rāmāk, sesija ir server side, tur nekādi nafig session menedzeri būt nevar, tie nav cepumi:) Quote Link to comment Share on other sites More sharing options...
marcis Posted February 3, 2011 Report Share Posted February 3, 2011 Mana posta gudrība slēpās faktā, ka pie viena sesijas id nekad nebūs citas sesijas dati, attiecīgi hash, ko veido sesijas id, vienmēr būs valids. + jau pieminētais session_regenerate_id() prasītu apdeitot arī hashu (nu tas vēl būtu mazākais) Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.