Autor Zpráva
SteveO
Profil *
Zdravím, vždycky když si myslím, že už to funguje správně, tak po čase dojde o odhlášení.
Zkrátka - mám web se subdoménami a potřebuji být po přihlášení přihlášen na všech těchto subdoménách.

V souboru index.php, který poté includuje jednotlivé stránky v závislosti na adrese, mám toto:

session_set_cookie_params(3600*24*30, "/", ".mujweb.cz"); // platnost 1 měsíc
session_start();

Při každém vstupu na stránku, nezávisle na tom, jestli je uživatel přihlášen, nebo se chce přihlásit, se tedy provede odstartování session a nastavení platnosti cookie, která obsahuje SID.

Pokud se poté uživatel rozhodne přihlásit, stane se tak tímto kódem:

session_regenerate_id(); // ochrana před Session Fixation
$_SESSION["admin"]=true;
header("Location: ".$_SERVER["HTTP_REFERER"]);

Přihlášení funguje. Takto by to mělo vydržet měsíc. Jenže ono to vydrží jak kdy, někdy hoďku, někdy dvě...
Procházel jsem různá fóra, někde radili upravit ještě výchozí lifetime session přes ini_set(), to jsem zatím nezkoušel, připadá mi to jako takové řešení na prd.
Můžete mi někdo prosím říct, zda tam je nějaká chyba? Protože já žádnou nevidím. Nechce se mi kvůli jednoduchému přihlašování, kde se využívá pouze hesla, ukládat nějaké ID do DB, podle kterého by se pak přihlašování uchovávalo.

Moderátor Majkl578: Titulek „Session - stále to není ono - co dělám špatně?“ nevystihuje podstatu dotazu. Příště zkus prosím vymyslet lepší.
Majkl578
Profil
Trvanlivost session na straně serveru určuje hodnota session.gc_maxlifetime. Sessions, které jsou starší, jsou mazány garbage collectorem a obecně platí, že je maže a) CRON úloha, b) PHP samo. U možnosti b) platí, že délku živnotnosti určuje ten script, který má nejnižší hodnotu session.gc_maxlifetime.
Možné řešení je nastavit session.save_path na místo, kam bude mít přístup pouze daná aplikace a nastavit hodnotu session.gc_maxlifetime na stejnou nebo vyšší hodnotu jako je požadovaná expirace (v tvém případě tedy 3600*24*30).
SteveO
Profil *
Za titulek se omlouvám. A jak by se takováto situace správně měla vyřešit?
Předpokládám, že tady by asi se asi programátor vykašlal na PHPSESSID a udělal si vlastní COOKIE, jejíž hash by porovnával s DB a podle toho by přihlášení obnovil, uvažuji správně?


Jinak jestli to tedy chápu správně, tak ten řádek session_set_cookie_params(3600*24*30, "/", ".mujweb.cz"); nemá na platnost přihlášení v podstatě žádný vliv, protože určuje jen platnost cookie, kterou si session automaticky vytvoří, ale session na serveru stejně umře, až uplyne session.gc_maxlifetime?

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: