Jump to content
php.lv forumi

parbaude vai ielogojies


Recommended Posts

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;
}

Link to post
Share on other sites

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 by labaiss
Link to post
Share on other sites

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 by mounkuls
Link to post
Share on other sites

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 by Faks
Link to post
Share on other sites

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 by codez
Link to post
Share on other sites

+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 by EdgarsK
Link to post
Share on other sites

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 by tomaac
Link to post
Share on other sites
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.

Link to post
Share on other sites

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 by codez
Link to post
Share on other sites

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!

Link to post
Share on other sites

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 by codez
Link to post
Share on other sites

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)

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...