[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Cookies как прикрутить автологин?
flint
Есть страница index где собственно и находится блок авторизации
<?php
session_start();
//Поключаем конфиг
include("config.inc.php");
include("functions.inc.php");
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
or die("Can't connect" );

mysql_select_db($DB, $link) or die ("Can't select BD");


if ( isset( $_GET["action"]) and $_GET["action"]=="logout" ) unset( $_SESSION["SID"] );
//if ( isset($_COOKIE['hash'])){$_SESSION = getLogin($_COOKIE['hash']);}
//$_SESSION['SID'] = $_SESSION['uniq_id'];
//print_r($_SESSION['uniq_id']);



if(md5(crypt($_SESSION['user'],$_SESSION['password'])) != $_SESSION['SID'] || md5(crypt($_COOKIE['user'],$_SESSION['password'])) != $_SESSION['SID']) {

if(!$_POST['do']){

echo '
<form name="1" action="" method="post">
email:<input name="login" type="text"; value=""> <br/>
password:<input name="password" type="password" value=""> <br/>
<input name="do" type="submit" value="Login">
</form>
<br/><a href="reg.php"/>Registration</a>
<br/><a href="lostpass.php">Lost your password?</a>'
;
}

if($_POST['do']) {

$login = $_POST['login'];
$upass = $_POST['password'];
if($login !='' AND $upass !='') {

$q1=mysql_query("SELECT * FROM `users` WHERE `email`='".$login."' AND `password`='".md5($upass.salt)."' AND `status`=1");

if(mysql_num_rows($q1)===1) {

$r=mysql_fetch_array($q1);
$_SESSION['user'] = $r['nick'];
$_SESSION['password'] = $r['password'];

$_SESSION['SID'] = md5(crypt($r['nick'], $r['password']));

@Header("Location: index.php");
}
else {echo 'Invalid email / password<br/><a href="index.php"/>Back</a>
<br/><a href="reg.php"/>Registration</a>'
;}
}

else {echo 'There are no any information about your account<br/><a href="index.php"/>Back</a>
<br/><a href="reg.php"/>Registration</a>'
;}
}
}

else {

$q2 = @mysql_query("SELECT * FROM `users` WHERE `nick`='".$_SESSION['user']."' AND `password`='".$_SESSION['password']."' AND `status`=1");
if(@mysql_num_rows($q2)==1){
$r2 = @mysql_fetch_array($q2);
echo 'You are: '.ucfirst($r2['nick']).'<br/>';
echo '<a href="index.php">Home</a> ';
echo '<a href="index.php?page=downloads">Downloads</a><br/>';
echo '<a href="account.php">Account panel</a><br/>';



if($_GET['page'] !='') {
@include("tpl/".$_GET['page'].".php");
}
else { @include("tpl/default.php");}


echo '<br/><br/><a href="index.php?action=logout">Logout</a>';
}
}

if($_GET['exit']) {@session_destroy(); unset($_GET['exit']); mysql_close($link); @Header("refresh: 0; url= index.php"); @Header("Location: index.php"); }
?>

В куке сидит уникальный hash который присваивается при регистрации каждому юзеру

Я не могу понять как сделать так чтобы при заходе на страницу из куки вытаскивался хэш затем данные бы сверялись с базой и впускали на скрытую страницу подскажите пожалуста как реализовать



Спустя 19 часов, 54 минуты, 30 секунд (25.08.2010 - 16:19) flint написал(а):
Ну что ребят никто ничего подсказать не может? =(

Спустя 32 минуты, 3 секунды (25.08.2010 - 16:51) Rivalryzerg написал(а):
Много конечно накручено.
Алгоритм должен быть следующий:
1. отправка формы ввода логина пароля
2. проверка наличия в базе пользователь с указанным логином и паролем
3. если пользователь есть, сформировать уникальный идентификатор сессии (sid) и добавить запись в таблицу sessions

структура таблицы в простейшем виде
sid - идентификатор сессии,
user_id - id пользователя,
expire - время жизни сессии (скажем time() + неделя)

а также записать в куки полученный sid
setcookie('sid', $sid, time() + 3600*24*7, '/');


Далее в начале любого скрипта сайта, где собственно требуется автологин:
1. проверить есть ли в куки переменная sid
2. если есть проверить в таблице sessions сессию с таким идентификатором
3. если сессия есть то проверить на всякий случай наличие пользователя с user_id
4. если все верно, то установить флаг что пользователь залогинен, например $_SESSION['auth'] = true;

Еще желательно удалять устаревшие сессии из таблицы sessions.

Если где что непонятно - спрашивайте.
PS: это не идеальный вариант, а лишь пример показывающий реализацию автологина

Спустя 23 минуты, 25 секунд (25.08.2010 - 17:15) flint написал(а):
ага я впринцепи понял что надо сделать но вот что у меня не выходит в cookie я записал уникальный хэш который при заходе на страницу сравнивается с базой и из базы вытаскивает массив с логином и паролем а также с id сессии$_SESSION['SID']

if ( isset($_COOKIE['hash'])){$_SESSION = getLogin($_COOKIE['hash']);}


у меня стоит проверка для сессий если существует такая пропускать пользователя далее
if(md5(crypt($_SESSION['user'],$_SESSION['password'])) != $_SESSION['SID']) {

но если взять из массива $_SESSION['user'] и $_SESSION['password'] и вставить из в скрипт представленный выше то он ни к чему не приведет и даже если вручную вбивать в поля логин пароль данные не переходит на скрытую страницу а остается на той же странице с полями ввода данных чем это объяснить?

Спустя 19 минут, 45 секунд (25.08.2010 - 17:34) Rivalryzerg написал(а):
Лучше не формировать хеш на основе каких либо данных об аккаунте, иначе в теории его можно подобрать.

Можно даже не создавать отдельную таблицу для сессий, а добавить это поле в таблицу users и заполнять его в момент ввода верного логина и пароля.

И в момент if (isset($_COOKIE['hash'])) просто делать запрос в базу по этому полю.

В вашем случае ошибка в том, что после ввода верного логина и пароля, вы записываете данные в массив $_SESSION. Но если закрыть браузер и открыть его снова - по-умолчанию, это будет совершенно другая сессия и соответственно совершенно другой массив $_SESSION. Поэтому и нет авторизации.

Я бы порекомендовал все же переделать как я писал выше.

Спустя 2 часа, 22 минуты, 7 секунд (25.08.2010 - 19:56) flint написал(а):
To: Rivalryzerg
Большое вам спасибо за советы они помогли мне разобраться biggrin.gif
немного переделал свой скрипт теперь автологин работает tongue.gif

Спустя 7 минут, 49 секунд (25.08.2010 - 20:04) flint написал(а):
Всплыл еще один вопрос =) :
а как сделать чтобы при заполнении формы входа когда начинаешь печатать сам подставлялся ник и пароль как например в gmail или как на phpforum.ru ? и это вообще php ?

Спустя 56 минут, 25 секунд (25.08.2010 - 21:01) Rivalryzerg написал(а):
flint, это скорее опция запоминания паролей в браузере.

Спустя 1 час, 17 минут, 13 секунд (25.08.2010 - 22:18) flint написал(а):
Да скорее всего вы правы, еще раз спасибо

Спустя 5 месяцев, 10 дней, 23 часа, 31 минута, 32 секунды (6.02.2011 - 22:49) Гость написал(а):
Долго искал, нашел, разобрался

Спустя 7 месяцев, 6 дней, 21 час, 18 минут, 19 секунд (13.09.2011 - 19:08) Guest написал(а):
а какой тогда идеальный вариант?

Спустя 1 день, 14 часов, 5 минут, 3 секунды (15.09.2011 - 09:13) Shaginov написал(а):
О, мне тоже помогло! Спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.