Пересоздание сессии в одном потоке линейного кода

zuart

Новичок
Приветствую.
Вопрос нетривиальный, логику работы "вход -> выход" изменить невозможно.

1. При открытии страницы стартует сессия, которая "подписывается" блоком параметров IP, User_Agent + еще парочка.
2. Адрес ссылки содержит в себе SSID.
3. При открытии другой/той же страницы по этому SSID-у возобновляется сессия и происходит проверка "подписи"...

Так вот проблема в том, что в случае некорректной подписи нужно СОЗДАТЬ НОВУЮ сессию БЕЗ УДАЛЕНИЯ СТАРОЙ...

Т.е. грубо говоря, если ссылку с SSID-ом юзер прощелкал и кто-то другой ей воспользовался, то нужно этому другому создать новую сессию и собственно говоря, выдать данные из нее, не поломав сессию валидного юзера.

Т.е. чтобы отработало что-то типа (операторы невалидные, просто логика):
session_id(SSID);
session_start();
if(!session_validate()){
session_close();
session_new_id();
session_start();
};
SSID = session_id()

Как это можно сделать без перезапросов страниц и т.п.
 

С.

Продвинутый новичок
Перезапрос надо делать в обязательном порядке. Потому, что
1). Данному юзеру надо поменять УРЛ этой страницы (в части SSID)
2). РНР должен поменять все ссылки на странице с учетом нового SSID.

Иначе нет смысла пользоваться встроенным сессионным механизмом РНР
 

zuart

Новичок
Неверный подход...
1. урл на ЭТОЙ странице ни на что уже не повлияет, масимум на F5
2. все ссылки на ЭТОЙ странице - эммм... как бы этот скрипт и генерит страницу, так что перед тем как генерить все внутренние ссылки как раз и нужно сменить сессию + SSID, чтобы с этим пользователем работать уже в ином "сессионном пространстве"
 

С.

Продвинутый новичок
F5 -- уже достаточная причина делать редирект, чтобы не плодить новорожденные сессии.

Как хак попрубуй абортнуть текущую сессию, удалить SSID и стартовать сессию заново. Не гарантировано.

Почему такая неприязнь к редиректу?
 

zuart

Новичок
ПОВТОРЮ!!!
- логику работы "вход -> выход" изменить невозможно

Так что F5 и т.п. варианты отметаются - и не стоит холиварить, плз... был бы это изначально мой код - реализовал бы иначе...

session_regenerate_id(false);

Эта процедурка генерирует для существующей сессии новый ИД, причем по новому ИД доступны все старые данные, а старый ИД считай накроется медным тазом - уже пробовал.
 

Тугай

Новичок
session_regenerate_id(false);

Эта процедурка генерирует для существующей сессии новый ИД, причем по новому ИД доступны все старые данные, а старый ИД считай накроется медным тазом - уже пробовал.
Еще пробуй, ниче не накрывается, данные в в новой сессии перезаполни, почисти на нужные:
Код:
session_start();

$_SESSION['a'] = 1;

$old_id = session_id();
session_write_close();

session_start();
session_regenerate_id();
$new_id = session_id();
$_SESSION['a'] = 2;
session_write_close();

session_id($old_id);
session_start();
echo $_SESSION['a']. "<br>";  // 1
session_write_close();

session_id($new_id);
session_start();
echo $_SESSION['a']. "<br>"; // 2
 

zuart

Новичок
Тугай, спасибо, работает. Хз, почему не отрабатывало на прошлой попытке, но видимо, что-то упустил, когда пробовал сам, по образу Вашего кода все завелось как нужно, СПАСИБО!
 
Сверху