2009-10-26 4 views
1

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

$_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 включен. Спасибо за помощь. Неудивительно, что я видел такое странное поведение.

ответ

6

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

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

4

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

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