Intereting Posts

Странное поведение PHP, если я помещаю восклицательный знак в имя переменной

У меня самая странная проблема с самим PHP, что я когда-либо видел.

Настроить:

PHP 5.33, (также пробовал PHP 5.2.14) в IIS

Проблема: PHP удаляет все данные сеанса, как только я помещаю восклицательный знак в ключ в массиве сеансов.

Пример:

session1.php

session_start(); $_SESSION["foo"] = 'test'; header('Location: session2.php'); 

session2.php

 session_start(); var_dump($_SESSION); die(); 

Хорошо работает, я вижу распечатку переменных данных.

 array(1) { ["foo"]=> &string(4) "test" } 

Но если я изменю строку в первом файле,

 $_SESSION["foo!"] = 'test'; 

или

 $_SESSION["f!oo"] = 'test'; 

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

 array(0) { } 

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

Есть идеи?

хорошо, о чём вы спрашиваете? в чем причина этой ошибки или как ее избежать?
Первая из них, вероятно, связана с некоторыми нечетными внутренними PHP. Например, вы не можете использовать цифровые клавиши с такими же последствиями.
Последний еще проще – не помещайте восклицательный знак в ключ в массиве сеанса.

Насколько я помню, механизм PHP-сессий возник из PHPLib – первой основы PHP. Написанные некоторыми добровольцами. Не очень оптимальный. После добавления к PHP в версии 4.0 можно использовать только в формате 4.1, но все же с некоторым нечетным наследием, например, с поддержкой register_globals. Последнее, скорее всего, является причиной вашей проблемы. Ключ массива $ _SESSION должен быть действительным именем переменной PHP для этого древнего поведения register_globals, где переменные сеанса становятся глобальными переменными PHP.

Это не Windows , это не Apache или какой-либо другой веб-сервер, это ядро ​​PHP.

Я посмотрел на него – начиная с 5.3 до 5.6, и проблема все еще существует: вам не разрешено иметь «!» (восклицательный знак) или «|» (труба) внутри ключа сеанса.

Патч Suhosin исправит его частично. Затем вам разрешается иметь восклицательный знак в любом положении внутри вашего ключа, но не на первой позиции, поэтому «foo!» разрешено, но не «! foo». Труба по-прежнему запрещена.

Исправление:

  1. Измените session.serialize_handler на php.ini на php_binary или php_serialize
  2. Перезагрузите веб-сервер.

Повеселись!