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

Форум PHP

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

 

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

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

тема: Авторизация. Как это работает.
 
 автор: hatsker   (04.12.2005 в 04:57)   письмо автору
 
 



<?php 
    
// Это файл handler.php 
    // Имя сервера базы данных, например $dblocation = "mysql28.noweb.ru" 
    // сейчас выставлен сервер локальной машины 
    
$dblocation "localhost"
    
// Имя базы данных 
    
$dbname "gbook"
    
// Имя пользователя... Скорее всего будет совпадать с вашим доменным именем 
    // у нас, например $dbuser = "softtime"; 
    
$dbuser "root"
    
// Пароль - в комментариях не нуждается ;-) 
    
$dbpasswd ""
    
// Соединяемся с сервером базы данных 
    
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd); 
    if (!
$dbcnx) { 
      echo( 
"<P>В настоящий момент сервер базы данных не 
                          доступен, поэтому корректное отображение 
                          страницы невозможно.</P>" 
); 
      exit(); 
    } 
    
// Выбираем базу данных 
    
if (! @mysql_select_db($dbname,$dbcnx) ) { 
      echo( 
"<P>В настоящий момент база данных не доступна, 
                          поэтому корректное отображение страницы 
                          невозможно.</P>" 
); 
      exit(); 
    } 
    
// Формируем и выполняем SQL-запрос для посетителя с 
    // именем $_POST['name'] 
    
$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($nme0); 
       
// Сравниваем пароль из базы данных и введённый посетителем 
       
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(); 
    } 
?>  



Форма

<?php 
  session_start
(); 
?> 
<form action=handler.php method=post> 
Имя посетителя : <input type=text name=name value=<?php echo $_SESSION['user']; ?>><br> 
Пароль : <input type=password name=password value=<?php echo $_SESSION['password']; ?>><br> 
<input type=submit value=Отправить> 
</form> 
<?php 
  
// Если посетитель "вошёл" - приветствуем его 
  
if(isset($_SESSION['user'])) echo "Здравствуйте, ".$_SESSION['user']."!"
?>


Вопрос......В коде все понятно. Не понятен механизм работы самой авторизации. Как я узнаю что пользователь зашел и зарегестрирован..через ссесию.? Тогда вопрос такой...мне всегда придется проверять существует ли эта сессия...или как (чтобы знать пользователь зарегестрировался или нет)? К примеру у меня есть страница администрирования. Как мне сделать так чтобы пользователь не мог зайти туда без знания пароля и имени. Хотя простым введением ../administration.php он туда попадет. Если не трудно приведите примерчик...как сделать чтобы я понял как этот механизм работает..или обьясниет по подробнее или ссылочки дайте кому не трудно..спасибо

   
 
 автор: Football   (04.12.2005 в 09:30)   письмо автору
 
   для: hatsker   (04.12.2005 в 04:57)
 

Ну во первых в коде аторизации желательно сделать следующее:

$name=htmlspecialchars(stripslashes(trim(mysql_escape_string($login))));
$password=htmlspecialchars(stripslashes(trim(mysql_escape_string($password))));

Иначе вам не избежать SQL иньекции.

Насчёт пролзователя и сессии - да. Это самый простой способ. Можно записат ьмеханизм в отдельный файл и затем инклудом впихнуть его во все соатльные файлы.

Что бы защитить страницу администратирования одной сессии с запоминанием логина и пароля мало, иначе взломать будет довольно легко. Для этого нужна ещё уникальная сессия. Её можно получить, например, вот так:

$session_id=md5(time());
$_SESSION['session_id'] = $session_id;

Далее тебе потребуется отдельная БД, в которой будет храниться имя сессии и последнее посещение. Вот например вот такая:

CREATE TABLE session (
  id_session int(5) NOT NULL AUTO_INCREMENT,
  session_id text,
  last_time text,
  PRIMARY KEY (id_session)
) TYPE=MyISAM;

Далее, после создания сесии, мы удаляем из таблицы старые записи и вставляем новые:

$time=time();
$past=time()-300;
            $delete_session=mysql_query("DELETE FROM session WHERE last_time < '$past'");
                if (!$delete_session) {
                echo mysql_error();
                die();
                }
            $vstavka_session=mysql_query("INSERT INTO wwt_session VALUES (0,'$session_id','$time')");
                if (!$vstavka_session) {
                echo mysql_error();
                die();
                }

Теперь в каждую старницу, которую необходимо зашщитить вставляем код:

session_start();

$code=$_SESSION['session_id'];

if (!$_SESSION['session_id']) {
echo "Вам сюда нельзя!!!";
die();
} else {
    $ath_ses=mysql_query("SELECT * From session WHERE session_id='$code' '");

    if (!$ath_ses) {
    echo mysql_error();
    die ();
    }
    
    $kol=mysql_num_rows($ath_ses);
    
    if ($kol<=0) {
    echo "Такой сессии не существует. Вы не можите здесь быть!!!";
    die();
    } else {
    $time=time();
    $smena_query="UPDATE session SET last_time='$time' WHERE session_id='$code'";
    $smena=mysql_query($smena_query);
        if (!$smena) {
        echo mysql_error();
        die ();
        }
    $past=time()-300;
    $delete_session=mysql_query("DELETE FROM session WHERE last_time < '$past'");
                if (!$delete_session) {
                echo mysql_error();
                die();
                }
    
    }
}

Ну вот вроде и все!

   
 
 автор: hatsker   (05.12.2005 в 07:08)   письмо автору
 
   для: Football   (04.12.2005 в 09:30)
 

Понял...Вы ответили на мой вопрос. Спасибо.....К стати код взят с сайта softtime.ru (в моём верхнем посте)....То есть мне нужно вставлять этот код на каждую страницу которую мне нужно защитить..Ок я понял. И если ссесии нет при проверке...то он просто не покажет страницу die(); Я правильно понял ? А за код спасибо...Если бы вы еще и свои исправления вставили в тот код который я запостил, было бы просто супер. Хотя и на этом спасибо. Thanx.

   
 
 автор: elenaki   (05.12.2005 в 18:52)   письмо автору
 
   для: Football   (04.12.2005 в 09:30)
 


$ath_ses=mysql_query("SELECT * From session WHERE session_id='$code' '"); 


в этой строке ошибка - лишняя кавычка.
надо так:


$ath_ses=mysql_query("SELECT * From session WHERE session_id='$code'"); 


и здесь нужно название таблицы просто session, wwt_ не нужно, это из другой жизни (скрипта)

INSERT INTO wwt_session 

   
 
 автор: Football   (05.12.2005 в 20:44)   письмо автору
 
   для: elenaki   (05.12.2005 в 18:52)
 

Ага, спасибо что подправили. Это из своего кода брал, пришлось немного переделывать поскольку у меня и название таблицы другое и защита с ещё несколькими "фокусами" :)

   
 
 автор: elenaki   (11.12.2005 в 12:31)   письмо автору
 
   для: Football   (05.12.2005 в 20:44)
 

а еще - вот здесь:


$name=htmlspecialchars(stripslashes(trim(mysql_escape_string($login)))); 
$password=htmlspecialchars(stripslashes(trim(mysql_escape_string($password)))); 


почему stripslashes? ведь перед вводом в базу надо делать addslashes, т.е. экранировать "плохие" символы. а stripslashes - перед выводом из базы.

это ошибка, опечатка или новая мода?

   
 
 автор: WebTech   (11.12.2005 в 14:23)   письмо автору
 
   для: elenaki   (11.12.2005 в 12:31)
 

Однако права elenaki. Надо бы addslashes. Очепятка, наверное :-)

   
Rambler's Top100
вверх

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