Ярлыки переменной сессии PHP? - PullRequest
1 голос
/ 27 октября 2009

Итак, я выполняю некоторые операции на PHP-сайте, использующем переменные $_SESSION. Я начал видеть очень очень странное поведение, и после нескольких часов отладки я просто понял это. Например, допустим, у меня есть переменная сеанса, подобная этой:

$_SESSION['user']['id'] = 123;
$_SESSION['user']['firstname'] = 'John';
$_SESSION['user']['lastname'] = 'Doe';

В какой-то момент в скрипте вызывается таблица MySQL с использованием некоторых классов Zend:

$sql = "SELECT whatever FROM table";
$user = $db->fetchRow($sql);

Теперь вот где начинается странность ... После того, как этот вызов базы данных сделан, мое значение массива $_SESSION['user'] внезапно изменилось на объект, извлекаемый из вызова базы данных ...

По сути: $_SESSION['user'] теперь совпадает с объектом, который был извлечен с помощью метода fetchRow DB, который должен был храниться в переменной $user. Я никогда не видел этого раньше.

Единственное, что я могу понять, это то, что имя переменной $user совпадает с именем ключа массива $_SESSION['user'], оно действует как ярлык или что-то в этом роде.

Это какие-то странные ярлыки сессий PHP, о которых я никогда раньше не слышал?

Кстати, я знаю, что прямой доступ к $_SESSION vars - не лучшая практика. Я не создавал этот сайт. Моя работа - просто исправить некоторые вещи и добавить некоторые функции.

ОБНОВЛЕНИЕ: Конечно, register_globals включен. Спасибо за быструю помощь, ребята. Не удивительно, что я видел такое странное поведение.

Ответы [ 2 ]

6 голосов
/ 27 октября 2009

Звучит так, как будто у вас register_globals установлено значение On в PHP.ini. Отключение должно исправить это.

Если у вас нет доступа к изменению PHP.ini, обсуждается альтернативное решение здесь

4 голосов
/ 27 октября 2009

Проверьте, включен ли регистр глобалов . Доступ к $ _ SESSION является единственным способом безопасного доступа к данным сеанса.

Регистр глобалов - это старая функция, которая превращала глобальные переменные в локальные переменные. Проблема в том, что вы не могли безопасно знать, откуда поступают данные. То, что вы ожидаете от сеанса, может быть установлено с помощью переменной get, post или cookie. Так что было очень легко обойти безопасность.

...