Вопрос

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

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

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

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

<*>

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

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

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

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

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

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

SESSION['user']['id'] = 123;

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

<*>

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

<*>

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

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

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

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

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

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

SESSION['user']['firstname'] = 'John';

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

<*>

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

<*>

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

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

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

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

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

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

SESSION['user']['lastname'] = 'Doe';

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

<*>

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top