<?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: это не идеальный вариант, а лишь пример показывающий реализацию автологина
Алгоритм должен быть следующий:
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']
у меня стоит проверка для сессий если существует такая пропускать пользователя далее
но если взять из массива $_SESSION['user'] и $_SESSION['password'] и вставить из в скрипт представленный выше то он ни к чему не приведет и даже если вручную вбивать в поля логин пароль данные не переходит на скрытую страницу а остается на той же странице с полями ввода данных чем это объяснить?
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. Поэтому и нет авторизации.
Я бы порекомендовал все же переделать как я писал выше.
Можно даже не создавать отдельную таблицу для сессий, а добавить это поле в таблицу users и заполнять его в момент ввода верного логина и пароля.
И в момент if (isset($_COOKIE['hash'])) просто делать запрос в базу по этому полю.
В вашем случае ошибка в том, что после ввода верного логина и пароля, вы записываете данные в массив $_SESSION. Но если закрыть браузер и открыть его снова - по-умолчанию, это будет совершенно другая сессия и соответственно совершенно другой массив $_SESSION. Поэтому и нет авторизации.
Я бы порекомендовал все же переделать как я писал выше.
Спустя 2 часа, 22 минуты, 7 секунд (25.08.2010 - 19:56) flint написал(а):
To: Rivalryzerg
Большое вам спасибо за советы они помогли мне разобраться
немного переделал свой скрипт теперь автологин работает
Большое вам спасибо за советы они помогли мне разобраться
немного переделал свой скрипт теперь автологин работает
Спустя 7 минут, 49 секунд (25.08.2010 - 20:04) flint написал(а):
Всплыл еще один вопрос =) :
а как сделать чтобы при заполнении формы входа когда начинаешь печатать сам подставлялся ник и пароль как например в gmail или как на phpforum.ru ? и это вообще php ?
а как сделать чтобы при заполнении формы входа когда начинаешь печатать сам подставлялся ник и пароль как например в 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 написал(а):
О, мне тоже помогло! Спасибо!