Вход в ISP Config навсегда прервал мои сессии PHP и куки

Чтобы объяснить мою проблему, я должен добавить некоторую контекстную информацию:

У нас есть веб-сайт, он работает с сессиями и работает 7 лет без проблем, за исключением нашего администратора сервера, он не может войти, и мы никогда не знали, почему... до сих пор...

Наш администратор сервера находится в отпуске, поэтому мне пришлось выполнить некоторые из его работ, в том числе войти в систему через ISP Config, который расположен на том же сервере и в домене, используя другой порт (8080), я вошел в систему, чтобы проверить некоторые значения, а затем когда я возвращаюсь на наш веб-сайт, я не могу войти, как администратор нашего сервера.

Делая некоторую отладку, я обнаружил, что это проблема с сессиями, при каждом обновлении session_id() изменяется.

используя ini_get я получил session.cookie_domain и session.cookie_secure пустые.

Если я сделаю print_r($_COOKIE) то PHPSESSID не PHPSESSID, если я установлю его на любое значение, оно исчезнет, даже если я напишу длинный срок действия. Он не сохраняется, если я установил 2 куки, как это:

setcookie("PHPSESSID", "MYSESSION", time()+365*24*60*60, '/');
setcookie("a", "b", time()+365*24*60*60, '/');

а затем print_r($_COOKIE); Я получаю это:

Array ( [a] => b )

У меня нет.htaccess, поэтому у меня нет правил, кажется, что в конфигурации ISP есть что-то, что изменило способ хранения куки.

Я мог бы спросить на webmasters.stackexchange.com, но мне нужен ответ PHP, чтобы установить новые значения, когда кто-то входит в мой сайт после входа в конфигурацию ISP.

Это мой текущий код для тестирования:

<?php
session_set_cookie_params(3600,"/");
session_start();
//$_SESSION[b_id]=1;
setcookie("PHPSESSID", "GTS", time()+365*24*60*60, '/');
setcookie("a", "b", time()+365*24*60*60, '/');
echo "<div>b_id: $_SESSION[b_id]</div>";
echo "<div>session_id: ".session_id()."</div>";
echo "<div>cookie_domain: ".ini_get('session.cookie_domain')."</div>";
echo "<div>save_path: ".ini_get('session.save_path')."</div>";
echo "<div>cookie_secure: ".ini_get('session.cookie_secure')."</div>";
print_r($_COOKIE);
/*echo "<pre>";
print_r(ini_get_all());
echo "</pre>";*/
?>

Это вывод (значение session_id меняется каждый раз):

b_id:
session_id: du95eljbkct54qktvcd18a7ej0
cookie_domain:
save_path: /var/lib/php/sessions
cookie_secure:
Array ( [a] => b )

Это вывод функции ini_get_all():

[session.auto_start] => Array   (
    [global_value] => 0
    [local_value] => 0
    [access] => 2
)
[session.cache_expire] => Array (
    [global_value] => 180
    [local_value] => 180
    [access] => 7
)
[session.cache_limiter] => Array    (
    [global_value] => nocache
    [local_value] => nocache
    [access] => 7
)
[session.cookie_domain] => Array    (
    [global_value] => 
    [local_value] => 
    [access] => 7
)
[session.cookie_httponly] => Array  (
    [global_value] => 
    [local_value] => 
    [access] => 7
)
[session.cookie_lifetime] => Array  (
    [global_value] => 0
    [local_value] => 3600
    [access] => 7
)
[session.cookie_path] => Array  (
    [global_value] => /
    [local_value] => /
    [access] => 7
)
[session.cookie_secure] => Array    (
    [global_value] => 
    [local_value] => 
    [access] => 7
)
[session.entropy_file] => Array (
    [global_value] => /dev/urandom
    [local_value] => /dev/urandom
    [access] => 7
)
[session.entropy_length] => Array   (
    [global_value] => 32
    [local_value] => 32
    [access] => 7
)
[session.gc_divisor] => Array   (
    [global_value] => 1000
    [local_value] => 1000
    [access] => 7
)
[session.gc_maxlifetime] => Array   (
    [global_value] => 1440
    [local_value] => 1440
    [access] => 7
)
[session.gc_probability] => Array   (
    [global_value] => 0
    [local_value] => 0
    [access] => 7
)
[session.hash_bits_per_character] => Array  (
    [global_value] => 5
    [local_value] => 5
    [access] => 7
)
[session.hash_function] => Array    (
    [global_value] => 0
    [local_value] => 0
    [access] => 7
)
[session.lazy_write] => Array   (
    [global_value] => 1
    [local_value] => 1
    [access] => 7
)
[session.name] => Array (
    [global_value] => PHPSESSID
    [local_value] => PHPSESSID
    [access] => 7
)
[session.referer_check] => Array    (
    [global_value] => 
    [local_value] => 
    [access] => 7
)
[session.save_handler] => Array (
    [global_value] => files
    [local_value] => files
    [access] => 7
)
[session.save_path] => Array    (
    [global_value] => /var/lib/php/sessions
    [local_value] => /var/lib/php/sessions
    [access] => 7
)
[session.serialize_handler] => Array    (
    [global_value] => php
    [local_value] => php
    [access] => 7
)
[session.upload_progress.cleanup] => Array  (
    [global_value] => 1
    [local_value] => 1
    [access] => 2
)
[session.upload_progress.enabled] => Array  (
    [global_value] => 1
    [local_value] => 1
    [access] => 2
)
[session.upload_progress.freq] => Array (
    [global_value] => 1%
    [local_value] => 1%
    [access] => 2
)
[session.upload_progress.min_freq] => Array (
    [global_value] => 1
    [local_value] => 1
    [access] => 2
)
[session.upload_progress.name] => Array (
    [global_value] => PHP_SESSION_UPLOAD_PROGRESS
    [local_value] => PHP_SESSION_UPLOAD_PROGRESS
    [access] => 2
)
[session.upload_progress.prefix] => Array   (
    [global_value] => upload_progress_
    [local_value] => upload_progress_
    [access] => 2
)
[session.use_cookies] => Array  (
    [global_value] => 1
    [local_value] => 1
    [access] => 7
)
[session.use_only_cookies] => Array (
    [global_value] => 1
    [local_value] => 1
    [access] => 7
)
[session.use_strict_mode] => Array  (
    [global_value] => 0
    [local_value] => 0
    [access] => 7
)
[session.use_trans_sid] => Array    (
    [global_value] => 0
    [local_value] => 0
    [access] => 7
)
[session.cookie_domain] => Array    (
    [global_value] => 
    [local_value] => 
    [access] => 7
)
[session.cookie_httponly] => Array  (
    [global_value] => 
    [local_value] => 
    [access] => 7
)
[session.cookie_lifetime] => Array  (
    [global_value] => 0
    [local_value] => 3600
    [access] => 7
)
[session.cookie_path] => Array  (
    [global_value] => /
    [local_value] => /
    [access] => 7
)
[session.cookie_secure] => Array    (
    [global_value] => 
    [local_value] => 
    [access] => 7
)

Как вернуться к моей системе сессий по умолчанию, как до входа в конфигурацию ISP?


Отвечая на вопросы Ильи Бурсова

Открытие страницы в режиме инкогнито позволяет мне войти в систему нормально, и PHPSESSID не меняется.

Очистка куки не сработала, PHPSESSID все еще меняется.

phpinfo дал мне соответствующую информацию:

Set-Cookie: PHPSESSID=ositfoouhvosgcklk2k14r7t25; expires=Fri, 07-Dec-2018 19:28:01 GMT; Max-Age=3600; path=/
// This is the same time it was created, so it is creating and expiring inmediately!

Expires: Thu, 19 Nov 1981 08:52:00 GMT
// 1981!?

У меня есть сотрудник (в той же сети), который может войти на мой сайт.


Через 2 дня я не могу решить проблему, сегодня мы провели новый тест, чтобы воспроизвести эту ошибку, наш веб-разработчик вошел в систему с помощью ISP Config, и теперь он не может войти в мою систему !!

Та же ошибка, что и у меня и у нашего администратора сервера.

Я использую Chrome в Windows 10.

ISP Config версия 3.1.11

Кажется, у этого парня была такая же проблема 6 лет назад: PHPSESSID не был сохранен в cookie

Ответы

Ответ 1

К сожалению, у меня недостаточно репутации, чтобы комментировать ваш вопрос.

С вашим кодом я получаю два заголовка Set-Cookie: Set-Cookie Headers

В моем хранилище cookie хранится только PHPSESSID = GTS, а не сгенерированный идентификатор сеанса: Cookie Storage

Не могли бы вы попытаться удалить или закомментировать setcookie("PHPSESSID", "GTS", time()+365*24*60*60, '/'); и попробуй еще раз?

Ответ 2

Что ж, через четыре месяца тестирования я собираюсь ответить на свой вопрос, чтобы помочь другим, имеющим эту проблему.

ISP Config использует идентификатор сеанса имени PHP по умолчанию, поэтому, если вы запускаете другую систему в том же домене, вы не можете использовать один и тот же идентификатор.

первый способ решить эту проблему - сделать то, что @misorude сказал в своем комментарии, перед началом любой сессии измените все имена сеансов на другие:

session_name('MySystem'); // your session string ID
session_start();

В качестве идентификатора строки сеанса используйте любую строку, которую хотите, всегда используйте одну и ту же во всей вашей системе и не используйте значение по умолчанию "PHPSESSID".

Сессия истекла слишком быстро, это потому, что я запустил 2 системы в том же домене, что прокомментировала ссылка second2none.

более короткое время session.gc_maxlifetime, будет использоваться для всех систем в домене.

В этом вопросе показан второй альтернативный способ решения проблемы путем изменения каталога сеанса, вызывая функцию [session_save_path()][4].

Существует третий способ, если вы не хотите изменять идентификатор имени сеанса или каталог сеанса во всех ваших файлах, вы также можете изменить конфигурацию session.save_path, как предложил Альваро Гонсалес.