Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] czas sesji
Forum PHP.pl > Forum > PHP
dopelganger
cześć
mam banalne pytanie, i może śmieszne i głupie zarazem więc prosze o wyrozumiałość dla "skrępowanego umysłu" smile.gif

ale zgłupiałem , więc pytam:
czy jeżeli ustawię sesje na x czasu , np: 10 minut to czy ona wygaśnie po tym czasie mimo tego że będzie działanie na stronie, czy "nie wygaśnie" questionmark.gifquestionmark.gif

  1. ini_set( 'session.gc_maxlifetime', $minut);
  2. ini_set( 'session.cookie_lifetime', $minut);


dzięki
Michael2318
Pojęcie 'długość trwania sesji' oznacza, że jeśli user zalogował się na stronę - jest zalogowanym użytkownikiem - ale pozostał on na jakiejś stronie u Ciebie i nie wykonuje żadnych operacji (nie odświeża strony, nie przechodzi między podstronami - po prostu jest nieaktywny) to jeśli wreszcie powiedzmy po pół godziny się zjawi i zrobi jakikolwiek ruch na stronie to skrypt z automatu go wyloguje bo długość sesji była ustawiona powiedzmy na 10 minut.

Ja u siebie robię to tak:

Pod session_start(), dorzucam session_regenerate_id w celu zabezpieczenia się przed session hijacking i co odświeżenie strony taki kod:

  1. private function user_authorisation()
  2. {
  3. $ip = $_SERVER['REMOTE_ADDR'];
  4. $agent = $_SERVER['HTTP_USER_AGENT'];
  5.  
  6. if ( !isset($_SESSION['login']) )
  7. {
  8. return FALSE;
  9. }
  10.  
  11.  
  12. if ( $_SESSION['login']['user_agent'] !== $agent )
  13. {
  14. $this->logout();
  15.  
  16. return FALSE;
  17. }
  18.  
  19. if ( $_SESSION['login']['IP'] == $ip )
  20. {
  21. if ( (intval($_SESSION['login']['last_active']) + $this->config['session_timeout']) >= time() )
  22. {
  23. $_SESSION['login']['last_active'] = time();
  24.  
  25. return TRUE;
  26. }
  27. else
  28. {
  29. $this->logout();
  30.  
  31. return FALSE;
  32. }
  33. }
  34. else
  35. {
  36. $this->logout();
  37.  
  38. return FALSE;
  39. }
  40. }


tylko, że to jest w OOP, ale to nie ważne. Teraz sam sobie sprawdzasz ile trwała sesja usera, sprawdzasz czy user_agent się zgadza oraz czy adres IP pasuje.
Po pierwsze w miare zabezpieczone po drugie masz długość sesji i wylogowanie po przekroczeniu tego czasu.
Pyton_000
Jeżeli jest hosting współdzielony to może i tak nie zadziałać.
Jeżeli będzie akcja to nie wygaśnie

tu masz ciekawy wątek: http://stackoverflow.com/a/1270960
dopelganger
Cytat(Michael2318 @ 3.07.2014, 09:42:17 ) *
Pojęcie 'długość trwania sesji' oznacza, że jeśli user zalogował się na stronę - jest zalogowanym użytkownikiem - ale pozostał on na jakiejś stronie u Ciebie i nie wykonuje żadnych operacji (nie odświeża strony, nie przechodzi między podstronami - po prostu jest nieaktywny) to jeśli wreszcie powiedzmy po pół godziny się zjawi i zrobi jakikolwiek ruch na stronie to skrypt z automatu go wyloguje bo długość sesji była ustawiona powiedzmy na 10 minut.


robie testa smile.gif i okazuje sie że pomimo odświeżania strony sesja wygasa po ustawieniu jej czasu :/

test:

  1.  
  2. if (!isset($_SESSION["tester"])) {
  3.  
  4. ini_set('session.gc_maxlifetime',10);
  5. ini_set('session.cookie_lifetime',10);
  6.  
  7. $_SESSION["tester"] = 'test';
  8. echo 'nie ma session... ustawiam';
  9. } else {
  10. echo 'jest session...';
  11. }


Michael2318
Ale nic nie wyciąnąłeś z tego co Ci napisałem. Po pierwsze wywal to wszystko:

  1. ini_set('session.gc_maxlifetime',10);
  2. ini_set('session.cookie_lifetime',10);


session_start() podczas załadowania całej aplikacji ma zawsze występować tylko raz i ma to być druga linia pliku, zaraz po <?php.
Dalej, zaraz pod session_start, wrzuć session_regenerate_id(true);. Następnie do sesji masz przypisać tablicę z danymi, czyli oprócz Twojego test (zakładam, że to jest nick usera obecnie zalogowanego), masz zapisać czas ostatniej aktywności:

  1. $_SESSION['tester'] = array(
  2. 'nick' => 'test',
  3. 'ip' => $_SERVER['REMOTE_ADDR'],
  4. 'user_agent' => $_SERVER['HTTP_USER_AGENT'],
  5. 'last_active' => time());


I teraz masz sprawdzać to w ten sposób:

  1. $session_time = 10; // czas trwania sesji w minutach
  2. $session_time = $session_time * 60;
  3.  
  4. if ( isset($_SESSION['tester']) ) // jeśli sesja została przypisana...
  5. {
  6. $ip = $_SERVER['REMOTE_ADDR'];
  7. $uagent = $_SERVER['HTTP_USER_AGENT'];
  8.  
  9. if ( $uagent !== $_SESSION['tester']['user_agent'] || $ip !== $_SESSION['tester']['ip'] ) // jeśli ip lub user agent nie zgadza się z tym przypisanym podczas sesji...
  10. {
  11. session_destroy(); // niszczymy sesje
  12. header("location: index.php"); // oraz przekierowujemy na główną stronę, żeby dane się przeładowały oraz żeby usera nie zostawić np. w edycji profilu...
  13. }
  14.  
  15. if ( ($_SESSION['tester']['last_active'] + $session_time) < time() ) // jeśli przekroczono długość sesji...
  16. {
  17. session_destroy(); // niszczymy sesje
  18. header("location: index.php"); // oraz przekierowujemy na główną stronę, żeby dane się przeładowały oraz żeby usera nie zostawić np. w edycji profilu...
  19. }
  20. }


Tylko jeszcze pamiętaj, żeby po tym całym sprawdzaniu dodać aktualizacje czasu ostatniej aktywności sesji na obecny czas bo inaczej to zawsze po przekroczeniu tego 10min będzie wylogowywać.

  1. if ( isset($_SESSION['tester']) )
  2. {
  3. $_SESSION['tester']['last_active'] = time();
  4. }


napisałem Ci praktycznie gotowca.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.