php 7.3 не удается открыть скрытый сеанс (session_id () не может установить id) - PullRequest
0 голосов
/ 23 марта 2020

У меня есть приложение php, которое открывает сессию и отправляет соответствующий повар ie в браузер, как обычно.

Где-то в скрипте я хочу закрыть текущий сеанс, без вывода сообщений откройте новый в фоновом режиме, получите некоторые значения из этого «фонового сеанса», закройте его снова и возобновите основной сеанс (тот, за который пользователь получил куки).

В Debian Stretch с PHP 7.0 следующий минимальный пример работал как талисман, но теперь в PHP 7.3 (Debian Buster) я получаю несколько предупреждений, и пример перестает работать.

Ожидаемый вывод (как в PHP 7.0):

Main session closed now...<br>
Read data '10' and closed hidden session again...<br>
Main session resumed...<br>

Фактический вывод (как в PHP 7.3):

Main session closed now...<br>
Warning: session_id(): Cannot change session id when headers already sent
Warning: session_start(): Cannot start session when headers already sent
Read data '' and closed hidden session again...<br>
Warning: session_id(): Cannot change session id when headers already sent
Warning: session_start(): Cannot start session when headers already sent
Main session resumed...<br>

Минимальный (не) рабочий пример:

$options=array('use_cookies'=>false, 'cache_limiter'=>'');
session_start();
$main_id=session_id();
$_SESSION["value"] = "xxx";
session_write_close();
echo "Main session closed now...<br>\n";
flush();

session_id("IdOfHiddenSession");
session_start($options);
$count=$_SESSION['count']++;
session_write_close();
echo "Read data '$count' and closed hidden session again...<br>\n";
flush();

session_id($main_id);
session_start($options);
echo "Main session resumed...<br>\n";
flush();

Как это исправить?

1 Ответ

0 голосов
/ 28 марта 2020

Решение состоит в том, чтобы отключить файлы cookie сеанса для всех сеансов при запуске сценария вместо разрешения файлов cookie для первых session_start() и отключения их для последующих вызовов session_start().

В этом случае вы должны отправить повара ie для основного сеанса самостоятельно!

Итак, при запуске сценария выполните:

ini_set("session.use_cookies", 0);
ini_set("session.use_only_cookies", 1);

И установите повара ie самостоятельно, если нужно:

header("Set-Cookie: {$name}={$id}; path=/; secure; HttpOnly; SameSite=Strict");

Пример кода вопроса, таким образом, становится следующим:

//do this *only* on script start before headers are sent
if(!headers_sent())
{
    session_cache_limiter('');
    ini_set("session.use_cookies", 0);
    ini_set("session.use_only_cookies", 1);
}

session_start();
$main_id=session_id();
//send cookie
header("Set-Cookie: PHPSESSID={$main_id}; path=/; secure; HttpOnly; SameSite=Strict");
$_SESSION["value"] = "xxx";
session_write_close();
echo "Main session closed now...<br>\n";
flush();

session_id("IdOfHiddenSession");
session_start();
$count=$_SESSION['count']++;
session_write_close();
echo "Read data '$count' and closed hidden session again...<br>\n";
flush();

session_id($main_id);
session_start();
echo "Main session resumed...<br>\n";
flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...