Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: вход на страницу администрирования
 
 автор: Roma   (19.05.2007 в 10:45)   письмо автору
 
 

Всем привет!!!
Читал разные статьи об авторизации, правильно ли я понял принцип работы авторизации:
1. создается форма (данные передаются на обработчик check.php).
2. В обработчике проверяется есть ли такой пользователь. Eсли есть, то, например $_SESSION['admin_name'] присваивается имя пользователя и $_SESSION['passw'] - его пароль. 3. И далее при входе на каждую страницу проверяется существования пользователя с именем $_SESSION['admin_name'] и паролем
$_SESSION['passw'] в базе данных.

Надеюсь, объяснил понятно. Заранее спасибо
ЗЫ Добавил две темы не специально, прошу не судить:)

   
 
 автор: fduch   (19.05.2007 в 11:37)   письмо автору
 
   для: Roma   (19.05.2007 в 10:45)
 

А зачем во втором случае проверять существование пользователя в БД?
Считаю что это лишнее!

   
 
 автор: Roma   (19.05.2007 в 11:58)   письмо автору
 
   для: fduch   (19.05.2007 в 11:37)
 

А как потом в index.php проверять зарегистрирован пользователь или нет?

   
 
 автор: Roma   (19.05.2007 в 14:45)   письмо автору
 
   для: Roma   (19.05.2007 в 11:58)
 

или же просто проверять

if(isset($_SESSION['admin_name']))

   
 
 автор: Trianon   (19.05.2007 в 14:56)   письмо автору
 
   для: fduch   (19.05.2007 в 11:37)
 

Затем, что пользователя могли удалить, отключить, забанить, изменить привелегии.

   
 
 автор: Trianon   (19.05.2007 в 14:58)   письмо автору
 
   для: Roma   (19.05.2007 в 10:45)
 

Зачем в SESSION['passw'] пихать пароль?
Пароль вообще лучше никуда не пихать.

   
 
 автор: Roma   (22.05.2007 в 14:21)   письмо автору
 
   для: 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 проверять авторизирован пользователь или нет?

   
 
 автор: Trianon   (22.05.2007 в 14:32)   письмо автору
 
   для: Roma   (22.05.2007 в 14:21)
 

Поподробнее можно.
Но только не на плохом примере.
Показывайте, как у Вас организована таблица пользователей. Храните Вы в ней пароль, или только его хеш? Отделена таблица паролей или совмещена с остальными данными?

Хотя даже в приведенном (плохом) примере сохранение пароля в сессии ничем не обусловлено.
Ну скажите мне, что в в данных сессии делать паролю?
Лежать и ждать, пока его оттуда сопрут?
Для аутентификации его оттуда не используют.

   
 
 автор: Roma   (22.05.2007 в 15:06)   письмо автору
 
   для: 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:09)   письмо автору
 
   для: Roma   (22.05.2007 в 15:06)
 

А как это с хешами?
Я так понял, что создаются две таблицы, в первой будут храниться хеши и имена, а во второй - хеши и пароли. Или я не так понял?
P.S. Если можно, то приведите пример правильной авторизации

   
 
 автор: Trianon   (22.05.2007 в 15:55)   письмо автору
 
   для: Roma   (22.05.2007 в 15:09)
 

Нет, я имел в виду несколько другое.
В первой таблице лежат открытые данные - id, имя, логин, открытый е-мэйл, дата дата регистрации, дата последнего посещения и прочее, прочее, прочее.

Во второй таблице - id, хеш пароля, хеш секретного е-мэйла.
Короче - все секретные данные представлены хешами, и убраны с глаз долой так, чтобы даже сервер БД не работал с ними лишний раз.

   
 
 автор: Trianon   (22.05.2007 в 15:47)   письмо автору
 
   для: 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($res0));
        
header("Location: http://site.adr/logged.php");
    }
}

   
 
 автор: Roma   (22.05.2007 в 18:46)   письмо автору
 
   для: Trianon   (22.05.2007 в 15:47)
 

Я извиняюсь, что не отвечал (уходил по делам).
Авторизация мне очень понравилась, спасибо.
Теперь такой вопрос: при переходе на страницу http://site.adr/logged.php как должна проверяться сессия $_SESSION['project']?

   
 
 автор: Trianon   (22.05.2007 в 18:58)   письмо автору
 
   для: Roma   (22.05.2007 в 18:46)
 

Что такое "должна проверяться сессия"?
Своими словами

   
 
 автор: Roma   (22.05.2007 в 19:21)   письмо автору
 
   для: Trianon   (22.05.2007 в 18:58)
 

я имел ввиду, что выше описанный скрипт проверяет существует ли такой пользователь в базе данных, и если существует, то переменной $_SESSION['project'], как я понял, присваивается id пользователя. Теперь в случае успешной регистрации при переходе на любую страницу, необходимо знать, что регистрация уже прошла, причем успешно. Как это сделать? я предполагаю, что необходимо проверить переменную $_SESSION['project'], только как?
Надеюсь, объяснил понятно.

   
 
 автор: Trianon   (22.05.2007 в 19:53)   письмо автору
 
   для: Roma   (22.05.2007 в 19:21)
 

Если в сессии есть $_SESSION['project']['id_user'] с ненулевым значением - значит сессия наша. Когда придет пора завершать сеанс - просто протрем $_SESSION['project']['id_user']

Или Вы опасаетесь того, что SID будет украден?
Можно и на этот счет сделать проверку... но тогда придется дополнительные куки вводить.

   
 
 автор: Roma   (22.05.2007 в 20:02)   письмо автору
 
   для: Trianon   (22.05.2007 в 19:53)
 

Просто я думал, что можно подделать переменную $_SESSION['project']['id_user'] (с помощью сокетов), ведь в случае такой проверки подходит любое ее значение. Или я ошибаюсь и такое сделать невозможно?

   
 
 автор: Trianon   (22.05.2007 в 20:17)   письмо автору
 
   для: Roma   (22.05.2007 в 20:02)
 

Рассказывайте, как именно.

Кстати, можно при аутентификации дописать в сессию REMOTE_ADDR , USETR_AGENT и случайное число, засунув последнее в сеансовый кукис . И сравнивать эти три вещи, отвергая сессию, если хотя бы одна не совпала.

Конечно, проверяя авторизацию лишь по существованию сессии, нельзя позволять пользователю совершать некоторые критические вещи. Менять собственные настройки безопасниости, например... Возможно, что-то еще.

   
 
 автор: Roma   (22.05.2007 в 20:22)   письмо автору
 
   для: Trianon   (22.05.2007 в 20:17)
 

Trianon, спасибо большое, вы мне очень помогли!!!

   
 
 автор: Trianon   (22.05.2007 в 20:25)   письмо автору
 
   для: Roma   (22.05.2007 в 20:22)
 

Нет. Спасибом не отделаетесь. :)

Рассказывайте как сокетами сессию ломать!

   
 
 автор: Roma   (22.05.2007 в 22:49)   письмо автору
 
   для: Trianon   (22.05.2007 в 20:25)
 

Я думал, что с помошью сокетов можно странице передать значения сессии (т.е., например, переменной $_SESSION['user_id'] присвоить любое значение) . В данном случае на страницу index.php администраторской части если можно было бы передать любое значение переменной $_SESSION['project']['id_user'], то условие if($_SESSION['project']['id_user'] !=0) будет выполняться почти всегда:)

   
 
 автор: Loki   (23.05.2007 в 10:12)   письмо автору
 
   для: Roma   (22.05.2007 в 22:49)
 

Сессионные переменные это просто файл на сервере. Клиенту ничего кроме идентификатора сессии (имени этого файла) не выдается. Так что единственно возможное его влияние на сессию, это передача правильного или неправильного идентификатора.

   
 
 автор: mefestofel   (22.05.2007 в 23:34)   письмо автору
 
   для: Trianon   (22.05.2007 в 20:25)
 

> Нет. Спасибом не отделаетесь. :)

> Рассказывайте как сокетами сессию ломать!

:-)))

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования