|
|
|
| Всем привет!!!
Читал разные статьи об авторизации, правильно ли я понял принцип работы авторизации:
1. создается форма (данные передаются на обработчик check.php).
2. В обработчике проверяется есть ли такой пользователь. Eсли есть, то, например $_SESSION['admin_name'] присваивается имя пользователя и $_SESSION['passw'] - его пароль. 3. И далее при входе на каждую страницу проверяется существования пользователя с именем $_SESSION['admin_name'] и паролем
$_SESSION['passw'] в базе данных.
Надеюсь, объяснил понятно. Заранее спасибо
ЗЫ Добавил две темы не специально, прошу не судить:) | |
|
|
|
|
|
|
|
для: Roma
(19.05.2007 в 10:45)
| | А зачем во втором случае проверять существование пользователя в БД?
Считаю что это лишнее! | |
|
|
|
|
|
|
|
для: fduch
(19.05.2007 в 11:37)
| | А как потом в index.php проверять зарегистрирован пользователь или нет? | |
|
|
|
|
|
|
|
для: Roma
(19.05.2007 в 11:58)
| | или же просто проверять
if(isset($_SESSION['admin_name']))
|
| |
|
|
|
|
|
|
|
для: fduch
(19.05.2007 в 11:37)
| | Затем, что пользователя могли удалить, отключить, забанить, изменить привелегии. | |
|
|
|
|
|
|
|
для: Roma
(19.05.2007 в 10:45)
| | Зачем в SESSION['passw'] пихать пароль?
Пароль вообще лучше никуда не пихать. | |
|
|
|
|
|
|
|
для: Trianon
(19.05.2007 в 14:58)
| | А можно по подробнее (из примера http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=80)
$query = "SELECT password FROM users WHERE name='".$_POST['name']."'";
$nme = mysql_query($query);
if(!$nme)
{
echo mysql_error();
echo "Ошибка выполнения запроса";
exit();
}
// Если запрос вернул результат - производим дальнейшую обработку
if(mysql_num_rows($nme) > 0)
{
// Получаем пароль
$password = mysql_result($nme, 0);
// Сравниваем пароль из базы данных и введённый посетителем
if ($_POST['password'] == $password)
{
// Идентификация прошла успешно - осуществляем
// "вход" посетителя. Для того, чтобы в течении текущей
// сесси посетитель не вводил своё имя пароль повторно -
// передаём их через сессию
if(session_start())
{
$_SESSION['user'] = $_POST['name'];
$_SESSION['password'] = $_POST['password'];
// Осуществляем автоматический переход на
// страницу index.php чтобы убедится, что
// посетитель "вошёл"
echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
</HEAD><body>";
}
}
else
{
echo "Ошибка идентификации: неправильный пароль";
exit();
}
}
// Если в результате запроса не получено ни одной
// строки - посетитель с таким именем не зарегистрирован
else
{
echo "Ошибка идентификации: посетитель не зарегистрирован";
exit();
}
|
Как в index.php проверять авторизирован пользователь или нет? | |
|
|
|
|
|
|
|
для: Roma
(22.05.2007 в 14:21)
| | Поподробнее можно.
Но только не на плохом примере.
Показывайте, как у Вас организована таблица пользователей. Храните Вы в ней пароль, или только его хеш? Отделена таблица паролей или совмещена с остальными данными?
Хотя даже в приведенном (плохом) примере сохранение пароля в сессии ничем не обусловлено.
Ну скажите мне, что в в данных сессии делать паролю?
Лежать и ждать, пока его оттуда сопрут?
Для аутентификации его оттуда не используют. | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 14:32)
| |
CREATE TABLE `users` (
`id_user` int(11) NOT NULL auto_increment,
`name` tinytext NOT NULL,
`pass` tinytext NOT NULL,
PRIMARY KEY (`id_user`)
)TYPE=MyISAM;
|
| |
|
|
|
|
|
|
|
для: Roma
(22.05.2007 в 15:06)
| | А как это с хешами?
Я так понял, что создаются две таблицы, в первой будут храниться хеши и имена, а во второй - хеши и пароли. Или я не так понял?
P.S. Если можно, то приведите пример правильной авторизации | |
|
|
|
|
|
|
|
для: Roma
(22.05.2007 в 15:09)
| | Нет, я имел в виду несколько другое.
В первой таблице лежат открытые данные - id, имя, логин, открытый е-мэйл, дата дата регистрации, дата последнего посещения и прочее, прочее, прочее.
Во второй таблице - id, хеш пароля, хеш секретного е-мэйла.
Короче - все секретные данные представлены хешами, и убраны с глаз долой так, чтобы даже сервер БД не работал с ними лишний раз. | |
|
|
|
|
|
|
|
для: Roma
(22.05.2007 в 15:06)
| | Ну поскольку На остальные вопросы Вы не отвечаете, я буду домысливать по своему вкусу.
Добавлю поле login tinytext not null к таблице.
Допустим в поле pass лежит такой хеш: md5($login.':'.md5("$login:$pwd"))
а форма авторизации содержит два поля - login и pwd
Тогда запрос на аутентификацию может быть обработан, например, так:
<?php
$login = $pwd = false;
if(isset($_POST['login']) && isset($_POST['pwd']))
{
$login = $_POST['login'];
$pwd = $_POST['pwd']; $_POST['pwd'] = $_REQUEST['pwd'] ='';
if(get_magic_quotes_gpc())
{
$login = stripslashes($login);
$pwd = stripslashes($pwd);
}
$h_login_pwd = md5("$login:$pwd");$pwd = '';
$login_hash = "$login:$h_login_pwd";
$sql_login = "'".mysql_escape_string($login)."'";
$sql_login_hash = "'"mysql_escape_string(login_hash)."'";
$sql = "
SELECT id_user
FROM users
WHERE pwd = md5($sql_login_hash)
AND login = $sql_login
";
$sql_login_hash = '';
$res=@mysql_query($sql) or die("Неудача при аутентификации пользователя");
if(mysql_num_rows($res) != 1)
die("Нет такого пользователя");
else
{
startsession();
$_SESSION['project']=array('id_user' =>mysql_result($res, 0));
header("Location: http://site.adr/logged.php");
}
}
|
| |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 15:47)
| | Я извиняюсь, что не отвечал (уходил по делам).
Авторизация мне очень понравилась, спасибо.
Теперь такой вопрос: при переходе на страницу http://site.adr/logged.php как должна проверяться сессия $_SESSION['project']? | |
|
|
|
|
|
|
|
для: Roma
(22.05.2007 в 18:46)
| | Что такое "должна проверяться сессия"?
Своими словами | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 18:58)
| | я имел ввиду, что выше описанный скрипт проверяет существует ли такой пользователь в базе данных, и если существует, то переменной $_SESSION['project'], как я понял, присваивается id пользователя. Теперь в случае успешной регистрации при переходе на любую страницу, необходимо знать, что регистрация уже прошла, причем успешно. Как это сделать? я предполагаю, что необходимо проверить переменную $_SESSION['project'], только как?
Надеюсь, объяснил понятно. | |
|
|
|
|
|
|
|
для: Roma
(22.05.2007 в 19:21)
| | Если в сессии есть $_SESSION['project']['id_user'] с ненулевым значением - значит сессия наша. Когда придет пора завершать сеанс - просто протрем $_SESSION['project']['id_user']
Или Вы опасаетесь того, что SID будет украден?
Можно и на этот счет сделать проверку... но тогда придется дополнительные куки вводить. | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 19:53)
| | Просто я думал, что можно подделать переменную $_SESSION['project']['id_user'] (с помощью сокетов), ведь в случае такой проверки подходит любое ее значение. Или я ошибаюсь и такое сделать невозможно? | |
|
|
|
|
|
|
|
для: Roma
(22.05.2007 в 20:02)
| | Рассказывайте, как именно.
Кстати, можно при аутентификации дописать в сессию REMOTE_ADDR , USETR_AGENT и случайное число, засунув последнее в сеансовый кукис . И сравнивать эти три вещи, отвергая сессию, если хотя бы одна не совпала.
Конечно, проверяя авторизацию лишь по существованию сессии, нельзя позволять пользователю совершать некоторые критические вещи. Менять собственные настройки безопасниости, например... Возможно, что-то еще. | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 20:17)
| | Trianon, спасибо большое, вы мне очень помогли!!! | |
|
|
|
|
|
|
|
для: Roma
(22.05.2007 в 20:22)
| | Нет. Спасибом не отделаетесь. :)
Рассказывайте как сокетами сессию ломать! | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 20:25)
| | Я думал, что с помошью сокетов можно странице передать значения сессии (т.е., например, переменной $_SESSION['user_id'] присвоить любое значение) . В данном случае на страницу index.php администраторской части если можно было бы передать любое значение переменной $_SESSION['project']['id_user'], то условие if($_SESSION['project']['id_user'] !=0) будет выполняться почти всегда:) | |
|
|
|
|
|
|
|
для: Roma
(22.05.2007 в 22:49)
| | Сессионные переменные это просто файл на сервере. Клиенту ничего кроме идентификатора сессии (имени этого файла) не выдается. Так что единственно возможное его влияние на сессию, это передача правильного или неправильного идентификатора. | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 20:25)
| | > Нет. Спасибом не отделаетесь. :)
> Рассказывайте как сокетами сессию ломать!
:-))) | |
|
|
|