Данные сессий PHP теряются при смене каталога? - PullRequest
2 голосов
/ 24 апреля 2010

У меня есть простая система входа в систему, использующая сеансы PHP, но совсем недавно кажется, что если вы посещаете страницы не в определенном каталоге (/ login /), вы всегда будете отмечены как не вошедшие в систему, даже когда вы это делаете. Кажется, что мои данные сеанса теряются, когда я меняю каталоги (скажем, на / login / user /).

Я не думаю, что сам коснулся кода с тех пор, как возникла проблема. Мог ли мой веб-хост сделать что-то для моей установки PHP, который мог бы удалить данные сеанса, и есть ли обходной путь?

EDIT:
Внутри каждого файла, требующего авторизации, он загружает файл loginfunctions.php, который вызывает session_start () и проверяет вход в систему. Файлы, которые работают в / login и я копирую и вставляю в / login / user, перестают работать, хотя я обновляю все соответствующие пути и ссылки.

EDIT2: Хорошо, немного кода.

На реальных страницах, которые дают мне ошибку, это аутентификация. код:

require_once("../../../includes/loginFunctions.php");

$login = new login; 
$login->checkLogin(0);

Внутри loginFunctions.php есть это:

class login{

    function checkLogin($requiredAccess){

            session_start();

            if($_SESSION['accesslevel'] < $requiredAccess || $_SESSION['logged_in'] != TRUE){
                die("You don't have access to this area. If you should have access, please log in again. <a href='/login/'>Login</a>");
            }

            if (isset($_SESSION['HTTP_USER_AGENT'])){
                if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])){
                    session_destroy();
                    die("Bad session. Please log in again. <a href='/login/'>Login</a> ");
                }
            } else {
                $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
            }

            if (!isset($_SESSION['initiated'])){
                session_regenerate_id();
                $_SESSION['initiated'] = true;
            }

    }

}

Переменная $ requiredAccess - это уровень доступа, необходимый для доступа к этой странице, поэтому, если у вас есть уровень доступа 3 в базе данных, вы можете просматривать страницы уровня 0, 1, 2 и 3. Это указывается, когда функция вызывается на главной странице, и сравнивается с уровнем доступа текущего пользователя, который определен в $ _SESSIONS при входе в систему.

Я получаю сообщение об ошибке «У вас нет доступа к этой области и т. Д.», Когда я пытаюсь получить доступ к этим страницам. Если я пытаюсь напечатать переменные $ _SESSION, ничего не отображается; они кажутся пустыми. Однако , если я перемещаю файл в папку / login / (на один уровень выше) и обновляю ссылки, они работают отлично, и все переменные печатаются нормально. Это заставляет меня думать, что код - это не та часть, которая не работает, а некоторые настройки в моей установке PHP, которая была изменена без моего уведомления.

Ответы [ 6 ]

2 голосов
/ 24 апреля 2010

возможно, вы не вызываете session_start () в начале страницы, не входящей в / login / ..?

1 голос
/ 27 июля 2010

У меня была похожая проблема. Убедитесь, что у вас нет файла php.ini. Удаление этого разобрало проблему. Все еще ищу именно поэтому. Файл php.ini может быть даже пустым, и он не позволит переносить данные сеанса в несколько каталогов ...

0 голосов
/ 28 октября 2011

Убедитесь, что у вас есть один и тот же php.ini файл в каждом каталоге, из которого вы хотите получить доступ к переменным сеанса.

0 голосов
/ 27 июля 2010

У меня была похожая проблема. Вы можете использовать: <? setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); ?>

или что-то подобное. я знаю, что cookie и переменные сессии - другое желаемое решение, но это помогло решить мою проблему.

См. Здесь для документации

0 голосов
/ 24 апреля 2010

Вот почему вы не должны использовать каталог для создания ложных дружественных URL-адресов ...

Не забудьте вызывать session_start () каждый раз, когда вам нужен сеанс.

0 голосов
/ 24 апреля 2010

Возможно, они изменили настройку php.ini session.cookie_path .

Вы должны позвонить session-set-cookie-params перед тем, как позвонить session_start и убедиться, что вы сами задали путь к cookie. Установите для него каталог высшего уровня, для которого вы хотите, чтобы сеанс был действительным. Например, если вы установите значение /login, оно будет действительным для /login и /login/user. Если вы хотите, чтобы ваш сеанс был действительным для сайта etire, укажите путь /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...