2010-06-18 15 views
44

tworzę sesji, gdy użytkownik loguje się tak:PHP Session Timeout

$_SESSION['id'] = $id; 

jaki sposób można określić limit czasu na tej sesji X minut, a następnie go wykonać funkcję lub stronę przekierowanie raz osiągnął X minut?

EDYCJA: Zapomniałem wspomnieć, że potrzebuję sesji do przekroczenia limitu czasu z powodu braku aktywności.

+9

możliwy duplikat [W jaki sposób wygasać sesję PHP po 30 minutach?] (Http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after- minut) – Kzqai

Odpowiedz

86

najpierw zapisać raz ostatni użytkownik złożył wniosek

<?php 
    $_SESSION['timeout'] = time(); 
?> 

w kolejnym wniosku, sprawdź jak dawno zrobili swoją poprzednią prośbę (10 minut w tym przykładzie)

<?php 
    if ($_SESSION['timeout'] + 10 * 60 < time()) { 
    // session timed out 
    } else { 
    // session ok 
    } 
?> 
+20

Ale sesja może przekroczyć limit czasu, jeśli domyślny limit czasu sesji w twoim PHPINI jest krótszy niż czas wybrał. Limit czasu jest zwykle krótszy niż godzina. Jeśli nie chcesz, aby klient kontrolował limit czasu, musisz połączyć ten kod z ini_set z session.cookie_lifetime. Ta odpowiedź również nie obsługuje przypadku, w którym klient usuwa pliki cookie. – Olhovsky

+2

Domyślnie PHP to "0", co oznacza: "Do czasu zamknięcia przeglądarki". Jeśli przeglądarka usunie plik cookie, zmienna '$ _SESSION ['timeout']' var nie zostanie ustawiona w pierwszej kolejności. Jednak pominąłem wszystkie inne czynności zarządzania sesjami, ponieważ to pytanie dotyczy tylko limitu czasu. – Jacco

42

Kiedy sesja wygasa dane już nie występuje, więc coś

if (!isset($_SESSION['id'])) { 
    header("Location: destination.php"); 
    exit; 
} 

przekieruje gdy sesja nie jest już aktywna.

Można ustawić, jak długo cookie sesji żyje użyciu session.cookie_lifetime

ini_set("session.cookie_lifetime","3600"); //an hour 

EDIT: Jeśli rozrządu sesje z powodu obaw bezpieczeństwa (zamiast wygody) używać zaakceptowane odpowiedź, jak komentarzach poniżej pokaż, jest to kontrolowane przez klienta, a zatem nie jest bezpieczne. Nigdy nie myślałem o tym jako o bezpieczeństwie.

+1

musisz usunąć cytaty o $ _SESSION ['id'] –

+0

Mimo że nie jesteś głosowaną odpowiedzią, twoje rozwiązanie wydaje się bezpieczniejsze, moje pytanie brzmi następująco: czy musisz ustawić limit czasu sesji na każdej stronie? Przypuszczam, że miałoby to sens, bo chciałbyś, żeby za każdym razem się restartował? Po drugie musisz zrobić session_start dla każdej strony, aby uzyskać dane sesji, lub tylko raz, aby ją uruchomić? Dzięki – nagates

+10

Występują pewne problemy z trwałością plików cookie sesji, przede wszystkim polega na * klienta *, aby go egzekwować. Żywotność plików cookie pozwala klientowi usuwać niepotrzebne/wygasłe pliki cookie, nie należy go mylić z żadnymi zabezpieczeniami. – Jacco

0
session_cache_expire(20); 
    session_start(); // NEVER FORGET TO START THE SESSION!!! 
    $inactive = 1200; //20 minutes *60 
    if(isset($_SESSION['start'])) { 
$session_life = time() - $_SESSION['start']; 
if($session_life > $inactive){ 
    header("Location: user_logout.php"); 
} 
    } 
    $_SESSION['start'] = time(); 

    if($_SESSION['valid_user'] != true){ 
    header('Location: ../....php'); 
    }else{ 

źródło: http://www.daniweb.com/web-development/php/threads/124500

+1

Po prostu wyświetlenie pierwszej znalezionej odpowiedzi i wklejenie jej do stosu przepełnienia stosu nie sprzyja punktowi tej witryny. Ponadto session_cache_expire() nie ma nic wspólnego z długością twojej sesji, więc wklejona odpowiedź zawiera niepoprawne informacje. –

+0

@ DavidBradbury Domyślnie plik cookie zapisuje identyfikator session_id, jeśli ciasteczko wygasa, nie można uzyskać dostępu do session_id, gdy klient zażąda. –

5

Najpierw sprawdź, czy sesja nie jest aleksem stworzone i jeśli nie stworzyć. Tutaj ustawiam go na 1 minutę.

<?php 
    if(!isset($_SESSION["timeout"])){ 
    $_SESSION['timeout'] = time(); 
    }; 
    $st = $_SESSION['timeout'] + 60; //session time is 1 minute 
?> 

<?php 
    if(time() < $st){ 
    echo 'Session will last 1 minute'; 
    } 
?> 
2
<script type="text/javascript"> 
window.setTimeout("location=('timeout_session.htm');",900000); 
</script> 

W nagłówku każdej strony pracuje dla mnie podczas testów witryny (strona nie jest jeszcze w produkcji). Strona HTML, do której należy, kończy sesję i po prostu informuje użytkownika o potrzebie ponownego zalogowania. Wydaje się to łatwiejsze niż korzystanie z logiki PHP. Chciałbym kilka komentarzy na temat tego pomysłu. Jakieś pułapki, które w nim nie widziałem?

+4

Nie wszyscy używają js – chuckieDub

+0

Jeśli masz wiele kart otwartych w tej samej witrynie, musisz odświeżyć je wszystkie, aby utworzyć działanie, w przeciwnym razie, jeśli będziesz nadal pracować na jednej karcie, inne będą wyświetlać "timeout_session.htm" po przekroczeniu limitu czasu. Bardzo frustrujące, zwłaszcza jeśli "timeout_session_pl.htm" niszczy/niszczy sesję. =) –

1
<?php 
session_start(); 

if (time()<$_SESSION['time']+10){ 
$_SESSION['time'] = time(); 
echo "welcome old user"; 
} 

else{ 
session_destroy(); 
session_start(); 
$_SESSION['time'] = time(); 
echo "welcome new user"; 
} 
?> 
0
<?php 
session_start(); 
if($_SESSION['login'] != 'ok') 
    header('location: /dashboard.php?login=0'); 

if(isset($_SESSION['last-activity']) && time() - $_SESSION['last-activity'] > 600) { 
    // session inactive more than 10 min 
    header('location: /logout.php?timeout=1'); 
} 

$_SESSION['last-activity'] = time(); // update last activity time stamp 

if(time() - $_SESSION['created'] > 600) { 
    // session started more than 10 min ago 
    session_regenerate_id(true); // change session id and invalidate old session 
    $_SESSION['created'] = time(); // update creation time 
} 
?> 
+0

Pamiętaj, aby skomentować odpowiedź i wyjaśnić, gdzie i w jaki sposób dodajesz limit czasu. – Rias

1

rozwiązanie Byterbit jest problematyczne, ponieważ:

  1. o wygaśnięciu sterowania klient cookie po stronie serwera jest kwestia bezpieczeństwa.
  2. Jeśli limit czasu wygaśnięcia po stronie serwera jest mniejszy niż ustawiony limit czasu po stronie klienta, strona nie odzwierciedla rzeczywistego stanu pliku cookie.
  3. nawet jeśli ze względu na komfort w fazie rozwoju jest to problem, ponieważ nie odzwierciedla właściwego zachowania (w czasie) na etapie wydawania.

dla plików cookie, ustawienie wygasania poprzez sesję.cookie_lifetime jest właściwym rozwiązaniem pod względem projektowania i bezpieczeństwa! do wygaśnięcia sesji możesz użyć session.gc_maxlifetime.

wygasanie plików cookie przez wywoływanie session_destroy może dać nieprzewidywalne wyniki, ponieważ mogły już wygasnąć.

Dokonywanie zmiany w php.ini jest również prawidłowe rozwiązanie, ale sprawia, że ​​wygasanie globalne dla całej domeny, które może nie być to, co naprawdę chcesz - niektóre strony mogą zachować niektóre pliki cookie bardziej niż inne.