Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация, с помощью сессий 
V
    Опции темы
nextzi0
Дата 25.11.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



php 5.3.1, все настройки сессий - по умолчанию

скрипт auth.php:

Код

<?php
    include ("connect.php");
    if (isset($_POST['auth_login']) && isset($_POST['auth_password']))
    {
        $con = sqlsrv_connect($MSSQLSERVER,$connectioninfo);
        $login= $_POST['auth_login'];
        $pass = $_POST['auth_password'];
        $query = "SELECT * FROM users WHERE loginname = '$login' AND password = '$pass'";
        $res = sqlsrv_query($con,$query);
        if ($row = sqlsrv_fetch_array($res)) {
            session_start();
            $_SESSION['user_id'] = $row['id'];
            $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
            sqlsrv_close($con);
            header("Location: http://myhost/page.php")
        }
        exit;
    }

    if (isset($_GET['action']) && $_GET['action']=="logout")
    {
      session_start();
      session_destroy();
      header("Location: http://myhost/login.html");
      exit;
    }
    if (isset($_REQUEST[session_name()])) session_start();
    if (isset($_SESSION['user_id']) && $_SESSION['ip'] == $_SERVER['REMOTE_ADDR']) return;
?>


Форма ввода логина и пароля: login.html
Код


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

</head>

<body>
<table align = "center" width="470" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td><div align="center">
      <form id="auth_form" name="auth_form" method="post" action= "auth.php" >


        <div align="center">
          <p>

          </p>
          <table width="294" border="0" cellspacing="0" cellpadding="0">
            <tr>
              <td width="89"><span class="style2">Логин:</span></td>
              <td width="205">
                <div align="center">
                  <input style='border:1px solid black;background-color:#FFFFCC' type="text" name="auth_login" />
                </div></td>
            </tr>
            <tr>
              <td><span class="style2">Пароль:</span></td>
              <td><div align="center">
                <div align="center">
                  <input style='border:1px solid black;background-color:#FFFFCC;margin-top:2px' type="password" name="auth_password" />
                </div></td>
            </tr>
            <tr>
              <td colspan="2"> <br>
                <div align="center">
                  <input style='border:1px solid black' type="submit" name="login" value="Войти" />

                </div>
              </td>
            </tr>
          </table>
          <p>&nbsp;</p>
        </div>
  </form>
 </tr>
</table>
</body>
</html>


Страница, на которую идет редирект после успешной авторизации: page.php:
Код

<?php 
   require ("auth.php");
   echo $_SESSION['user_id'];
?>


Проблема в том, что на странице page.php недоступна переменная $_SESSION['user_id']! и скрипт соот-но ничего не выводит. Если сделать так:
Код

  require ("auth.php");
  session_start();
  echo $_SESSION['user_id'];

то все работает. Но сессия ведь стартовала еще в скрипте auth.php, зачем снова делать session_start()? Хотел, чтобы механизм авторизации на сессиях работал в одном скрипте, можно было подключить его только 1 раз в каждом нужном мне скрипте, без повторного вызова session_start(). Почему так происходит?

--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
Pitlord
Дата 25.11.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 31.10.2009

Репутация: 4
Всего: 7



PM MAIL   Вверх
Simpliest
Дата 25.11.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(nextzi0 @  25.11.2009,  11:31 Найти цитируемый пост)
Но сессия ведь стартовала еще в скрипте auth.php, зачем снова делать session_start()

Читать мануал по работе с сессиями.


Цитата(nextzi0 @  25.11.2009,  11:31 Найти цитируемый пост)
 Хотел, чтобы механизм авторизации на сессиях работал в одном скрипте, можно было подключить его только 1 раз в каждом нужном мне скрипте, без повторного вызова session_start(). 

Используем mod_rewrite и единую точку входа для всего приложения.

P.S. второй вариант сложнее, чем прочитать мануал по сессиям.


--------------------
user posted image
PM   Вверх
nextzi0
Дата 25.11.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



Этот скрипт авторизации работает без повторного session_start() на другой машине, где версия PHP 5.2.5. Я его просто подключаю в каждом нужном мне файле и все. 
Кстати, такое может быть из за того, что на одной машине я использую пхп как php-cgi, на другой - как php5isapi (где все равботает)?. На обоих IIS.

Это сообщение отредактировал(а) nextzi0 - 25.11.2009, 14:01
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
Pitlord
Дата 25.11.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 31.10.2009

Репутация: 4
Всего: 7



Значит там включён параметр "session.auto_start"

http://php.net/manual/en/session.configura...sion.auto-start
PM MAIL   Вверх
capitan
Дата 25.11.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 27.2.2005
Где: Москва

Репутация: 9
Всего: 13



nextzi0, Вам же сказали, читать мануал и не надеятся что session.auto_start будет включен.

Цитата

session_start() создаёт сессию (или продолжает текущую на основе session id, переданного через GET-переменную или куку).


Это сообщение отредактировал(а) capitan - 25.11.2009, 14:06
PM MAIL WWW ICQ   Вверх
nextzi0
Дата 25.11.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



Цитата(Pitlord @ 25.11.2009,  12:41)
http://phpfaq.ru/sessions

Мой пример как раз оттуда. Если ты заметил, то там сказано:

теперь достаточно написать во всех защищаемых скриптах строчку
require "auth.php";
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
Pitlord
Дата 25.11.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 31.10.2009

Репутация: 4
Всего: 7



nextzi0, попробуй изменить параметр "request_order" (php.ini или .htaccess):
Код

php_value request_order "GPC"

И вот эту строчку измени:
Код

if (isset($_REQUEST[session_name()])) session_start();

на просто
Код

session_start();


Добавлено через 2 минуты и 7 секунд
Вернее, даже просто один session_start() вверху auth.php сделай, а все остальные убери
PM MAIL   Вверх
Ипатьев
Дата 25.11.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



увлекательный топик
PM MAIL   Вверх
nextzi0
Дата 25.11.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



Цитата(Pitlord @ 25.11.2009,  14:02)
Значит там включён параметр "session.auto_start"

http://php.net/manual/en/session.configura...sion.auto-start

в конфиге session.auto_start = 0

Добавлено через 7 минут и 35 секунд
Pitlord, спасибо. Прописал в самом начале скрипта авторизации старт сессии. Все работает.
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
Pitlord
Дата 25.11.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 31.10.2009

Репутация: 4
Всего: 7



Цитата(nextzi0 @  25.11.2009,  14:49 Найти цитируемый пост)
в конфиге session.auto_start = 0

Да, я невнимательно первый пост прочитал
PM MAIL   Вверх
Ипатьев
Дата 25.11.2009, 15:12 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



MS SQL настолько крута, что инъекции не проходят только от страха перед её авторитетом ;)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0639 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.