Странное поведение PHP, если я вставлю восклицательный знак в имя переменной - PullRequest
4 голосов
/ 15 августа 2010

У меня самая странная проблема с самим 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?

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 25 ноября 2014

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

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

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

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

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

Веселись!

2 голосов
/ 15 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...