Odhlášení uživatele po určité době

Školení, která pořádám

Pokud si v aplikaci uchováváme informaci o přihlášenosti uživatele, je slušností mu nabídnout odkaz pro odhlášení. Vzhledem k tomu, že uživatelé se často sami neodhlašují, je vhodné kvůli bezpečnosti realizovat i automatické odhlášení po určité době nečinnosti.

Pokud si informaci o přihlášenosti uživatele uchováváme v cookie nebo v session proměnné udržované pomocí cookie, mohlo by nás napadnout realizovat automatické odhlášení uživatele pomocí nastavení časové platnosti této cookie. Toto řešení je ale slepou uličkou – čas nastavujeme na serveru, ale ověřuje se u klienta. Pokud se časy liší, tak cookie může ihned vypršet nebo naopak platit delší dobu. Druhým důvodem, proč toto řešení nebude fungovat, jsou paranoidní uživatelé, kteří si zakazují cookies s nastavenou dobou platnosti. Firefox se sice chová logicky – cookies platí po dobu své platnosti, nejdéle však do zavření prohlížeče, Internet Explorer ale cookies s nastavenou dobou platnosti vůbec nepřijme.

Tento problém je tedy lepší řešit na straně serveru:

<?php
if ($_SESSION["access_time"] < strtotime("-1 hour")) {
    $_SESSION["logged"] = false;
}
$_SESSION["access_time"] = time();
?>
Jakub Vrána, Dobře míněné rady, 3.5.2006, diskuse: 16 (nové: 0)

Diskuse

Honza Hučín:

Jen bych rád doplnil, že údaje o času posledního přístupu se mohou též uchovávat v databázi. Sice to zvyšuje zátěž aplikace (nutnost volání dotazu do db), na druhou stranu se tak uchovávají záznamy o aktivitě uživatelů a lze je využít pro zobrazení počtu návštěvníku online, pro monitorování provozu apod. Nicméně princip je zcela stejný, jak popisuje Jakub.

ZZ:

Tak nějak ale nechápu využití tohoto kusu kódu. Tento kód se přeci vykoná po akci uživatele (znovunačtení stránky atp.), co když ale uživatel prostě zavře prohlížeč. Mám to spouštět přes Cron?

ikona Jakub Vrána OpenID:

Session proměnné obvykle vyprší při zavření prohlížeče, takže tento případ není nutné zvlášť řešit.

xpfighter:

neviem ci je tento skript na 100% funkcny,
uz len ked sa pozriem na kod, myslim si ze ked sa uzivatel
spravne prihlasi a session (logged) sa nastavy na true
potom skript pokracuje dalej a zacne porovnavat session (access_time) - ktora je na prvy krat prazdna, tak nastavy session (logged) na FALSE, a az potom sa nastavy session (access_time) na hodnotu time().
Uzivatel sa musi prihlasit znova.

podla mna by mal byt ten kod spravne takto:

<?php
if(empty($_SESSION["access_time"]))$_SESSION["access_time"] = time();
if (
$_SESSION["access_time"] < strtotime("-1 hour")) {
    unset($_SESSION["logged"]);
}
$_SESSION["access_time"] = time();
?>

ikona Jakub Vrána OpenID:

To přeci záleží na tom, kdy se nastavuje $_SESSION["logged"]. Pokud to je před ověřením platnosti (a zároveň se nenastaví $_SESSION["access_time"]), tak je připomínka oprávněná, pokud to je až potom, tak je vše v pořádku.

xpfighter:

mas uplnu pravdu ja som to daval az potom, ale ked to bude chciet niekto pouzit tak si da na to pozor :)
Dakujem

zuzana:

tak jak to mam udelat abych se odhlasila!,

peter:

nebolo by vyhodnejsie rovno pouzit session_unset() a session_destroy() namiesto $_SESSION["logged"] = false;

ikona Jakub Vrána OpenID:

session_unset() je zastaralé, session_destroy() je možné použít, pokud už v $_SESSION nic jiného není. Jinak je možné použít také unset($_SESSION["logged"]).

ikona Jakub Vrána OpenID:

Výhoda použití $_SESSION["logged"] = false spočívá v tom, že je možné následně rozeznat automaticky odhlášené uživatele od neznámých.

Mara:

Bral bych třeba session_destroy() a k tomu přidat hlavičku na přesměrování na hlášku třeba, ať to vypadá propracovaně né snad? :)

shadyyx:

Ahoj...mal by som dotaz, ako by slo spravit to, aby sa uchovaval cas ako dlho je uzivatel prihlaseny v aplikaciiza den a spolu dohromady...

Potreboval by som totiz, aby napriklad aplikacia odhlasila a zaroven zamedzila pristup uzivatelovi, ktory bol za jeden den prihlaseny do aplikacie viac ako 3 hodiny...

Potom za rozne zasluhy by sa dal roznym uzivatelom tento cas zvysovat (za odmenu)...

Je jasne, ze je to potrebne riesit cez db, v teoretickej rovine viem ako na to, neviem ale ako spojazdnit v praktickej...som PHP-mierne pokrocily...

Had:

já si nejsem tak úplně jistý, nechci plýst odborníky, ale co jednoduše při přihlášení do uživatelského účtu zavolat:

session_cache_expire("pocet_sekund_prihlaseni");

standartně PHP už nastavuje 180, ale nic nikomu nebrání tam přiřadit jinou hodnotu, ne?

ikona Jakub Vrána OpenID:

Technická: čas se udává v minutách.

Tato direktiva nijak nesouvisí s trvalostí session, ale slouží k nastavení doby cachování stránky, pokud je tato cache zapnutá (defaultně není).

Hergi:

Ahojte vseci já by sem potřeboal vědět to samé na co se ptal uz ZZ byl bych rad kdyby se to trosku rozvedlo ->
(ZZ: Tak nějak ale nechápu využití tohoto kusu kódu. Tento kód se přeci vykoná po akci uživatele (znovunačtení stránky atp.), co když ale uživatel prostě zavře prohlížeč. Mám to spouštět přes Cron?) vím ze Jakub mu na to odpovedel a taky vim samosebou ze session zanikne .. pri vypnuti prohlizece .. ale co uz nevim je kam mam tento cript umistit ... Dokazal jsem zatim automaticke odhlaseni pouze pokud se nevypne prohlizec ... todle my prijde nejake čudné :-D Prosil bych o jinou odpoved budu vam nesmirne vdecny

Hergi:

hm asi tu na blbý dotazy neodpovidate co ? stejne by sem byl rád za vysvětlení jak server pracuje kdyz nacte php script ukonci docasne spojeni s klientem ? a script uz si znovu nespusti ? to by pak nahravalo faktu ze nechapu jak muze script poznat ze dana session neexistuje ... dokonce ani nas vecne  z rumovany ucitel na programovani my to nevysvetlil uz me to zacina stvat. Prosim vas kohokoliv odpovezte..

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.