Ярлыки переменной сессии PHP?
-
06-07-2019 - |
Вопрос
Итак, я занимаюсь некоторым обслуживанием сайта 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. Так что было очень легко обойти безопасность.