Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не могу создать полноценный механизм авторизации

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
algerian
Отправлено: 04 Июля, 2009 - 17:08:29
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




Авторизация происходит по сессии. При пересылке данных через форму скрипту-обработчику происходит проверка пользователя по базе данных и если такой пользователь присутствует, то он авторизовывается, а, при авторизации у него появляется возможность выйти из системы(logout). Проблема заключается в том, что, когда пользователь выходит из системы, при откатке страниц в браузере Opera "назад" на страницу входа при ее обновлении снова появляется регистрация в системе, т.е. данные методом "post" cнова отправляются скрипту-обработчику... Подскажите, пожалуйста, как этого избежать?...
Скрипт 1.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. //Cтарт сессии
  4. //Соединение с сервером MySQL
  5. $mycon = mysql_connect ( "localhost", "root", "avemarines" );
  6. //Выбор БД MySQL
  7. mysql_select_db ( "automotive", $mycon );
  8. //Если пользователь хочет войти, выполняется следующий блок
  9.         if ($_POST ['action'] == "enter") {
  10.                 if ($_POST ['session_id'] != session_id()) {
  11.                         print "Ошибка. Попытка передачи данных с другого хоста.<br>";
  12.                         }
  13.                 //Проверка данных, пришедших от пользователя
  14.                 if (isset ( $_POST ['username'] ) && isset ( $_POST ['password'] ) && $_POST ['username'] !== '' && $_POST ['password'] !== '') {
  15.                         //Если данные корректны, выполняем проверку в БД
  16.                         $username = $_POST ['username'];
  17.                         $password = $_POST ['password'];
  18.                         $result = @mysql_query ( "SELECT * FROM users WHERE username='$username' AND password='$password'" );
  19.                         //Указатель авторизации
  20.                         $auth == 0;
  21.                         //Если запрос выполнен успешно, то выводим на экран его имя и пароль
  22.                         if ($result !== FALSE && mysql_num_rows ( $result ) !== 0) {
  23.                                 //Авторизован
  24.                                 $auth = 1;
  25.                                 if (session_start(auth)){
  26.                                 $_SESSION['username'] = $username;
  27.                                 $_SESSION['password'] = $password;     
  28.                                 }
  29.                                 $mass = mysql_fetch_array ( $result );
  30.                                 print "Здравствуй, " . $username . "!</br>";
  31.                         } else { //Во всех остальных случаях сообщаем, что данные неверны либо некорректны
  32.                                 print "Данный пользователь не зарегистрирован в БД.<br>";
  33.                         }
  34.                 } else
  35.                         print "Введены некорректные данные данные.<br>";
  36.         }
  37. //Закрываем соединение с БД
  38. ?>
  39. <html>
  40. <head>
  41. <title>Авторизация.</title>
  42. </head>
  43. <body>
  44. <?="Сессия: " . session_id()?><br>
  45. <!-- Заголовок -->
  46. <table align="center" width=860 border=1 cellpadding=0 cellspacing=0>
  47. <tr><td height=40></td></tr>
  48. </table>
  49. <!-- Конец заголовка -->
  50. Пожалуйста,введите Ваши данные:
  51. <form method=post action=<?=$_SERVER ['SCRIPT_NAME']?>>
  52. <table align="left" border=0 cellspacing=0 cellpadding=0>
  53.         <tr>
  54.                 <td>Логин:</td>
  55.                 <td><input type="text" name="username" size=20></td>
  56.         </tr>
  57.         <tr>
  58.                 <td>Пароль:</td>
  59.                 <td><input type="password" name="password" size=20></td>
  60.         </tr>
  61.         <tr>
  62.                 <td><input type="submit"></td>
  63.                 <td><input type="hidden" name="action" value="enter"> <input
  64.                         type="hidden" name="session_id" value="<?=session_id()?>"></td>
  65.         </tr>
  66.         <tr>
  67.                 <td>Авторизация:</td>
  68.                 <td><?PHP
  69.                 if ($auth == 1)
  70.                         print "&nbsp;Да";
  71.                 else
  72.                         print "&nbsp;Нет";
  73.                 ?></td>
  74.         </tr>
  75. </table>
  76. </form>
  77. <a
  78.         href="http://localhost/automotive/adminspage.php?sesid=<?=session_id()?>">Администрирование</a>
  79. </body>
  80. </html>
  81.  


Скрипт 2
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. //Cтарт сессии
  4. //Соединение с сервером MySQL
  5. $mycon = mysql_connect ( "localhost", "root", "avemarines" );
  6. //Выбор БД MySQL
  7. mysql_select_db ( "automotive", $mycon );
  8. //Если пользователь хочет войти, выполняется следующий блок
  9. if ($_GET ['sesid'] != session_id()) {
  10.         print "Ошибка. Попытка передачи данных с другого хоста.";
  11.         print "Сессия:&nbsp;".session_id();
  12.         exit();
  13. } else {
  14.         if (! isset ( $_SESSION ['username'] ) && ! isset ( $_SESSION ['password'] )) {
  15.                 print "Ошибка авторизации";
  16.                 exit();
  17.         } else
  18.                 print "Здравствуйте,&nbsp;" . $_SESSION ['username']."!<br>";
  19.                 $auth = 1;
  20.                 if ($_POST['action']=='logout'){
  21.                         session_destroy();
  22.                         print "Сессия закрыта";
  23.                         $auth = 0;
  24.                 }
  25. }
  26.  
  27. //Закрываем соединение с БД
  28. ?>
  29. <html>
  30. <head>
  31. <title>Страница адмистрирования.</title>
  32. </head>
  33. <body>
  34. <?="Сессия: " . session_id()?><br>
  35. <table align="left" border=0 cellspacing=0 cellpadding=0>
  36.         <tr>
  37.                 <td>Авторизация:</td>
  38.                 <td><?PHP
  39.                 if ($auth == 1)
  40.                         print "&nbsp;Да";
  41.                 else
  42.                         print "&nbsp;Нет";
  43.                 ?></td>
  44.         </tr>
  45. </table>
  46. <form method="post" action=<?=$_SERVER['SCRIPT_NAME']."?sesid=".session_id()?>>
  47. <input type="hidden" name="action" value="logout">
  48. <input type="hidden" name="session_id" value="<?=session_id()?>">
  49. <input type="submit" value="Закрыть текущую сессию">
  50. </form>
  51. </body>
  52. </html>
  53.  
 
 Top
Burevestnik
Отправлено: 04 Июля, 2009 - 17:45:31
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




Данные post не передаются при обновлении страницы!

(Отредактировано автором: 04 Июля, 2009 - 20:19:28)

 
 Top
JustUserR
Отправлено: 04 Июля, 2009 - 18:10:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Цитата:
Данные post не передаются при обновлении страницы!
Еще как предеются - правда оявляется окошко точно и вы хоитет отпраит даные заново и если откзаться то напимшет Страница просрочена


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
maxtet
Отправлено: 04 Июля, 2009 - 18:43:54
Post Id



Новичок


Покинул форум
Сообщений всего: 63
Дата рег-ции: Февр. 2009  
Откуда: г.Херсон


Помог: 0 раз(а)




algerian, попробуйте свой скрипт-обработчик вставить в следующий блок:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if (!$_SESSION['username'])
  3.  {
  4.    // вставка html - кода с формой авторизации
  5.  }
  6. ?>

(Отредактировано автором: 04 Июля, 2009 - 18:59:16)

 
 Top
algerian
Отправлено: 05 Июля, 2009 - 11:26:47
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




maxtet пишет:
algerian, попробуйте свой скрипт-обработчик вставить в следующий блок:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if (!$_SESSION['username'])
  3.  {
  4.    // вставка html - кода с формой авторизации
  5.  }
  6. ?>

Если бы знать функцию(http-заголовок), которая уничтожает односессионную cookie у клиента. Пробовал выключить у себя прием cookie, session_id менялось постоянно при обновлении страницы. Это говорит о том, что браузер посылает скрипту (при включенном приеме cookie) идентификатор сессии и тот стартует сессию с этим идентификатором. А если перезапустить браузер, то cookie пропадает. Так вот есть ли какой заголовок или функция для удаления этой односессионной cookie при выходе из системы(аутентификации)?
 
 Top
maxtet
Отправлено: 05 Июля, 2009 - 12:14:31
Post Id



Новичок


Покинул форум
Сообщений всего: 63
Дата рег-ции: Февр. 2009  
Откуда: г.Херсон


Помог: 0 раз(а)




Попробуй использовать перезагрузку текущей страницы после удаления сессии.
PHP:
скопировать код в буфер обмена
  1. if ($_POST['action']=='logout'){
  2.             session_destroy();
  3.             echo "<HTML><HEAD>
  4.                 <META HTTP-EQUIV='Refresh' CONTENT='0; URL='>
  5.                 </HEAD><body>";
  6.            
  7.         }
 
 Top
JustUserR
Отправлено: 05 Июля, 2009 - 15:18:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




algerian Уж лучше тогда Header("Location: ".$_SERVER['PHP_SELF']."");
Или на JS перезагрузку страницы сдеать что еще проще


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
algerian
Отправлено: 05 Июля, 2009 - 16:16:21
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




maxtet пишет:
Попробуй использовать перезагрузку текущей страницы после удаления сессии.
PHP:
скопировать код в буфер обмена
  1. if ($_POST['action']=='logout'){
  2.             session_destroy();
  3.             echo "<HTML><HEAD>
  4.                 <META HTTP-EQUIV='Refresh' CONTENT='0; URL='>
  5.                 </HEAD><body>";
  6.            
  7.         }

JustUserR пишет:
algerian Уж лучше тогда Header("Location: ".$_SERVER['PHP_SELF']."";
Или на JS перезагрузку страницы сдеать что еще проще

Я уже пробовал делать перезагрузку страницы, и, к сожалению, снова загруженная страница стоит после той, с которой были отправлены данные POST запросом. Я смотрел как происходит авторизация на IPB со своей стороны, там, если вернуться к странице, откуда отправляются данные, если ее обновить после выхода из системы, загружается страница с предложением пройти регистрацию еще раз.
 
 Top
JustUserR
Отправлено: 05 Июля, 2009 - 18:13:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




algerian А может AJAXом сделать чтобы было неповадно возвращаться назад - то есть если пользователя вернется назад то все равно с помощью AJAXа произойдет обновление и аново счивается сессия (Точнее ее отсутсвие) и тогда можно предложить залогиниться заново


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
algerian
Отправлено: 05 Июля, 2009 - 20:12:29
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




JustUserR пишет:
algerian А может AJAXом сделать чтобы было неповадно возвращаться назад - то есть если пользователя вернется назад то все равно с помощью AJAXа произойдет обновление и аново счивается сессия (Точнее ее отсутсвие) и тогда можно предложить залогиниться заново

Есть еще одна проблема - я не знаю JS и AJAX((. Может быть Вы знаете где можно скачать понятную литературу(желательно в формате PDF)?
 
 Top
JustUserR
Отправлено: 05 Июля, 2009 - 20:35:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Был у меня на примете один замечательны сайт - http://progbook[dot]ru/ - электронных книг много и все бесплатно
(С) На правах рекламы Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
algerian
Отправлено: 05 Июля, 2009 - 20:54:42
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




JustUserR пишет:
Был у меня на примете один замечательны сайт - http://progbook[dot]ru/ - электронных книг много и все бесплатно
(С) На правах рекламы Улыбка

Спасибо! Очень ценный ресурс.. Тема будет продолжена скриптом аутентификации;)
 
 Top
snmit
Отправлено: 15 Июня, 2010 - 12:01:48
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




Я кстати, тоже столкнулся с такой проблемой. Opera действительно отправляет повторно данные, если вернуться на неё или обновить.
Выход принудительной перезагрузкой страницы не поможет. Почему? А, что если пользователь ссылку site.ru/logout/ открыл в новой вкладке, а страницу где он находился, просто обновит. Браузер может отправлять повторно данные, если поля содержаться в теги <form> </form>, если использовать просто в теле документа поля input и отправлять их посредством js и ajax, то проблема действительно в чем-то исчезнет.
 
 Top
JustUserR
Отправлено: 16 Июня, 2010 - 11:05:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




snmit пишет:
Браузер может отправлять повторно данные, если поля содержаться в теги <form> </form>
Не совсем так поскольку браузер повторно отправляет данные с выдачей соответствующего предупреждения не при запросе самой страницы с POST-формой - а при переходе на страницу которая была сама запрошена POST-методом на основе данных введенных из формы
При этот не обязательно использовать динамическую передачу данных с помощью Iframe/AJAX - поскольку можно просто убрать соответствующую страницу из истории хотя бы путем затирающего перенаправления


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB