Сессия PHP пуста, даже если идентификатор сессии правильный - PullRequest
1 голос
/ 21 февраля 2011

Вчера я искал почти все темы о сессиях php, я просмотрел руководство, и оно все еще не работалоИз-за этого я не спал очень поздно.

Сценарий: я вхожу в систему, используя стандартную HTML-форму.Мой сеанс заполнен некоторыми переменными, и он работает нормально.Затем я использую Flash uploadify для загрузки некоторых фотографий и перехожу с параметрами - PHPSESSID.Мой скрипт php не распознает сессию.Он видит это как пустой.Затем я пытаюсь получить сеанс с другим клиентом, таким как Firefox или Opera, и он тоже пуст.Затем я пытаюсь получить этот сеанс с другой вкладкой Chrome и , она работает

Как вы видите, моя единственная защита - это IP.Я не сканирую другие вещи, поэтому этот должен работать , когда передается хороший PHPSESSID и IP-адрес клиента совпадает, независимо от типа клиента, версии и т. Д.

Это init_session.php, файл, который я включаюкаждый раз в начале других файлов.Поэтому я знаю, что идентификатор сессии передается вместе с Flash.Но тогда сессия пуста.

Каталог установлен сверху, а путь прямой, поэтому с этим проблем быть не должно.Это также не работает, когда путь сохранения по умолчанию.Я также выключил автозапуск сеанса и сеанс использования только куки.Это ничего не изменило, за исключением того, что мне нужно установить cookie вручную.

Есть ли здесь что-то, что я могу попробовать?Я думаю, что у меня закончились варианты.

РЕДАКТИРОВАТЬ:
Я забыл о большинстве важных вещей, я думаю, что отключение suhosin.session.cryptua разрешит случай, но я не могу отключить его с помощью ini_set,Есть ли другой способ? Кажется, что эта опция шифрует сеанс с использованием поля user-agent, которое имело бы место.

ini_set('session.auto_start', '0');
ini_set('session.save_path','/public_html/nowy/tmp');

if (isset($_POST["PHPSESSID"])) {
    session_id($_POST["PHPSESSID"]);
} elseif (isset($_COOKIE['PHPSESSID'])) {
    session_id($_COOKIE["PHPSESSID"]);
} elseif (isset($_GET["PHPSESSID"])) {
    session_id($_GET["PHPSESSID"]);
} 
session_start();
setcookie("PHPSESSID", session_id(), time()+3600, "/");

if (!isset($_SESSION['user'])) {
$_SESSION['user'] = 0;
}

if (!isset($_SESSION['initiate'])) {
    session_regenerate_id();
    $_SESSION['initiate'] = true;
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}

echo ini_get('session.save_path').'<br />';

echo $_POST["PHPSESSID"];
print_r($_SESSION);

RESOLVED

Эта проблема была решена.Я не смог отключить cryptua, потому что мне нужно было скопировать оригинальный php5.ini и заменить некоторые переменные, чтобы он заработал.

Проблема, как и ожидалось suhosin.session.cryptua

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Как предложил Фроде в своем комментарии, я оставляю это как ответ.

Это может произойти при использовании любого flash-скрипта, а не только загрузки. Любой другой флэш-загрузчик, такой как SWFUpload, не получит сеанс, если поле агента пользователя не совпадает.

Это происходит, когда на вашем сервере установлено исправление suhosin, но иногда кажется, что эта проблема не возникает, даже если параметр suhosin.session.cryptua включен, как предложено alecgorge. Хотя я не уверен в этом. Конечно, вы можете перейти на flash этой переменной, используя php-скрипты, чтобы раскрыть user-agent пользовательского браузера, а затем flash может замаскировать себя под тот же браузер, но это не элегантное решение, и я не знаю actioncript, поэтому я не могу сказать, если flash действительно может это сделать.

Очень важно: На самом деле есть две настройки, которые могут исправить это исправление безопасности.

  1. suhosin.session.encrypt
  2. suhosin.session.cryptua

Если первый отключен, то сессия вообще не зашифрована, поэтому проблема не возникнет. Не рекомендуется отключать это. Если мы отключим только второй, то сеанс будет зашифрован, но шифрование не будет передаваться в поле user-agent. Это означает, что любой браузер или http-клиент может получить любой сеанс. Поэтому рекомендуется поставить некоторые другие поля безопасности. Suhosin может также обрабатывать защиту от сессий, поэтому рекомендую включить suhosin.session.cryptraddr. Другие настройки можно найти здесь:
Конфигурация Suhosin

Для решения этой проблемы я предлагаю:

  1. Проверьте phpinfo (), установлен ли suhosin. Если нет, то проблема не возникнет.
  2. Если suhosin установлен и suhosin.session.cryptua и suhosin.session.encrypt включены, скопируйте существующий и работающий php.ini. Это вверху страницы с информацией о php: Loaded Configuration File /public_html/php5.ini
  3. Создайте свой собственный php.ini и установите:
    • suhosin.session.encrypt = On
    • suhosin.session.cryptraddr = Вкл.
    • suhosin.session.cryptua = Выкл.
0 голосов
/ 21 февраля 2011

Обычно с Uploadify мне нужно сделать что-то вроде этого:

$('#uploadify').uploadify('scriptData':{'session_name':'<?php echo session_id(); ?>'}});

На клиенте в сочетании с чем-то вроде этого на стороне сервера:

if($_POST['session_name']) {
    session_id($_POST['session_name']);
}
session_start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...