Kolize session při ajaxových požadavcích

kuon
Člen | 25
+
0
-

Ahoj,
už na tom trávím několik dní a pořád to nemohu vyřešit. Používám v Nette knihovnu elFinder pro sdílený disk, která posílá několik rychlých ajaxových požadavků za sebou, což způsobí kolizi session a odhlášení uživatele, respektive založení nové session a ztráty předchozích dat.

K založení nové session mi docházelo i čistě jen v Nette při rychlém ajaxovém načítání odkazů na handle metody. Předělal jsem tedy session ze souborů na ukládání do databáze a od té doby se mi to v Nette nepodařilo „shodit“. Ale v elFinderu to zlobí pořád.

V Nette používám pro session databázi s vlastním handlerem. V neon souboru nastavuji i vlastní jméno:

session:
	handler: @sessionHandler
	name: ZIVASESSID

To mi vše funguje. ElFinder jsem záměrně nechal na FS a nastavuji odlišný název: session_name('ELFINDERSESSID'). I přesto mají potom dané rozdílné cookies stejnou hodnotu session ID, což podle mě způsobuje tu kolizi. Zkoušel jsem ukončit session v Nette před načtením knihovny elFinderu, zastavení a znovu načtení nebo session_regenerate_id(true); přímo v souborech elFinderu. Vše bez úspěchu.

        session_regenerate_id(true);
        session_name('ELFINDERSESSID');
        session_save_path('/disk_1/www/cz/zivasit/beta/temp/session');
        session_set_save_handler(new \SessionHandler(), true);
        session_start();

ElFinder prostě nějakým způsobem používá stejné session ID a přepisuje mi tím session pro Nette místo svoji. Nemáte někdo nápad, jak to vyřešit? Moc děkuji.

Marek Bartoš
Nette Blogger | 1319
+
0
-

Je v podstatě nemožné mít dvě sessions v jednom requestu, takto designovaná nebyla.
Při rychlém průzkumu knihovny jsem našel class elFinderSession implements elFinderSessionInterface – udělej si vlastní implementaci ve které jako klíč použiješ hodnotu z vlastní cookie a máš vyřešeno.

kuon
Člen | 25
+
0
-

Díky za odpověď, ale to jsem udělal hned jako první a nepomohlo. Možná to dělám blbě. Posílám upravený kód souboru elFinderSession.php, jestli bys na to mrknul, kde dělám chybu…

Do funkce get() jsem přidal podmínku session_name() != 'ELFINDERSESSID' :

    /**
     * {@inheritdoc}
     */
    public function get($key, $empty = null)
    {
        $closed = false;
        if (!$this->started || session_name() != 'ELFINDERSESSID') {
            $closed = true;
            $this->start();
        }

...další kód...

        return $data;
    }

Do funkce start() jsem přidal ukončení session, pokud jsou již nastartované – tzn. s předchozí podmínkou jen v případě, že session_name() != 'ELFINDERSESSID':

    /**
     * {@inheritdoc}
     */
    public function start()
    {
      set_error_handler(array($this, 'session_start_error'), E_NOTICE | E_WARNING);

        if ($this->started) {
            error_log('KONEC NESPRÁVNÉ SESSION: '.session_name().'-'.session_id());
            session_write_close();
        }

        if ($this->fixCookieRegist === true) {
            if ((int)ini_get('session.use_cookies') === 1) {
                if (ini_set('session.use_cookies', 0) === false) {
                    $this->fixCookieRegist = false;
                }
            }
        }

        session_set_save_handler(new \SessionHandler(), true);
        session_name('ELFINDERSESSID');
        session_regenerate_id(true);
        error_log('START: '.session_name().'-'.session_id());

        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
            if (session_status() !== PHP_SESSION_ACTIVE) {
                session_start();
            }
        } else {
            session_start();
        }

        $this->started = session_id() ? true : false;

        restore_error_handler();

        return $this;
    }

Editoval kuon (26. 11. 9:48)

kuon
Člen | 25
+
0
-

Vypisuji si error_log() při startu v Nette a potom při nastartování a ukončení session v elFinderu. Log vypadá takto:

[26-Nov-2025 09:26:15 Europe/Prague] Nette: ZIVASESSID-fe887f5a120f05d2a9831e876394715b-/prihlaseni/-Cookies: Array
(
    [_nss] => 1
    [ZIVASESSID] => fe887f5a120f05d2a9831e876394715b
    [nette-debug] => abcdef
    [tracy-session] => 3cb8f9f827
)

[26-Nov-2025 09:26:17 Europe/Prague] Nette: ZIVASESSID-fe887f5a120f05d2a9831e876394715b-/prihlaseni/-Cookies: Array
(
    [_nss] => 1
    [ZIVASESSID] => fe887f5a120f05d2a9831e876394715b
    [nette-debug] => abcdef
    [tracy-session] => 3cb8f9f827
)

[26-Nov-2025 09:26:18 Europe/Prague] Nette: ZIVASESSID-e54850ee27152362d1fcd273666a757f-/kruh/disk/prvni?_fid=m9kl-Cookies: Array
(
    [_nss] => 1
    [nette-debug] => abcdef
    [tracy-session] => 3cb8f9f827
    [ZIVASESSID] => e54850ee27152362d1fcd273666a757f
)

[26-Nov-2025 09:26:19 Europe/Prague] Nette: ZIVASESSID-d2efdb2b28b19e5d88c2705cebbc82d1-/kruh/disk/prvni?do=disk-kruh-connector&cmd=open&target=&init=1&tree=1&_=1764145577488-Cookies: Array
(
    [_nss] => 1
    [nette-debug] => abcdef
    [tracy-session] => 3cb8f9f827
    [ZIVASESSID] => d2efdb2b28b19e5d88c2705cebbc82d1
)

[26-Nov-2025 09:26:19 Europe/Prague] START: ZIVASESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] KONEC NESPRÁVNÉ SESSION: ZIVASESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] Nette: ZIVASESSID-92ffb9ea3afb48e12fc3b601484f58a3-/kruh/disk/prvni?do=disk-kruh-connector&cmd=subdirs&targets%5B%5D=t4_Lw&targets%5B%5D=t3_Lw&targets%5B%5D=t2_Lw&targets%5B%5D=t1_Lw&targets%5B%5D=l4_Lw&preventDefault=true&reqid=19abf454030270-Cookies: Array
(
    [_nss] => 1
    [nette-debug] => abcdef
    [tracy-session] => 3cb8f9f827
    [ZIVASESSID] => 92ffb9ea3afb48e12fc3b601484f58a3
    [ELFINDERSESSID] => 92ffb9ea3afb48e12fc3b601484f58a3
)

[26-Nov-2025 09:26:19 Europe/Prague] START: ZIVASESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KONEC NESPRÁVNÉ SESSION: ZIVASESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:20 Europe/Prague] Nette: ZIVASESSID-db266807fd1895332ced23b02d57004d-/kruh/disk/prvni?do=disk-kruh-connector&cmd=subdirs&targets%5B%5D=l3_Lw&targets%5B%5D=l2_Lw&preventDefault=true&reqid=19abf45403024f-Cookies: Array
(
    [_nss] => 1
    [nette-debug] => abcdef
    [tracy-session] => 3cb8f9f827
    [ZIVASESSID] => 92ffb9ea3afb48e12fc3b601484f58a3
    [ELFINDERSESSID] => 92ffb9ea3afb48e12fc3b601484f58a3
)
Marek Bartoš
Nette Blogger | 1319
+
0
-

Nechápeme se :)
Pořád tam máš konflikt dvou různě pojmenovaných sessions. Předtím jsi tam měl dva různé přístupy ke stejné session (nativní a z Nette), což nejspíš též dělalo potíže.
Udělej si kompletně vlastní implementaci elFinderSessionInterface. Možná ti bude stačit jen tam použít Session z Nette, ale spíš bych se přikláněl k možnosti udělat to bez session. Zjednodušeně vzato je session jen klíč uložený v cookie a data která se pod tímto klíčem ukládají na serveru. Můžeš si tak progress ukládat třeba do dočasných souborů a netrápit se tím, proč se ti sessions přepisují

kuon
Člen | 25
+
0
-

Tak problém bude asi někde jinde… Kompletně jsem si to přepsal na používání vlastních souborů místo standardních session a Nette si stejně při ajaxovém požadavku v rámci elFinderu založí z nějaké důvodu novou session, i když mu do ní podle mě vůbec nesahám. Jak zjistit k čemu tam skutečně dochází? Debugger mi nic nevypíše.

kuon
Člen | 25
+
0
-

Rozhodl jsem se to vyřešit jinak, takže už není potřeba. Díky za tvoje navedení.