PHP會話超時



Answers

當會話到期時,數據不再存在,所以類似於

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

只要會話不再有效,它就會重定向。

您可以使用session.cookie_lifetime設置會話cookie的有效時間

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

編輯:如果由於安全問題(而不是方便)計時會話,請使用接受的答案,如下面的評論所示,這是由客戶控制的,因此不安全。 我從未將此視為安全措施。

Question

當用戶登錄時,我正在創建一個會話:

$_SESSION['id'] = $id;

如何在X分鐘的會話上指定超時,然後讓它在達到X分鐘後執行功能或頁面重定向?

編輯:我忘了提到由於不活動我需要會話超時。




<script type="text/javascript">
window.setTimeout("location=('timeout_session.htm');",900000);
</script>

在網站測試期間,每個頁面的標題一直在為我工作(該網站尚未投入生產)。 它所屬的HTML頁面結束會話,只是通知用戶需要再次登錄。 這似乎比使用PHP邏輯更容易。 我喜歡這個想法的一些評論。 我沒見過的任何陷阱?




Byterbit解決方案存在問題,因為:

  1. 讓客戶端控制服務器端cookie過期是一個安全問題。
  2. 如果在服務器端設置的到期超時小於客戶端設置的超時,則該頁面不會反映cookie的實際狀態。
  3. 即使為了開發階段的舒適性,這也是一個問題,因為它不會反映發布階段的正確行為(在時間上)。

對於cookie,通過session.cookie_lifetime設置到期是設計明智和安全方面的正確解決方案! 對於會話到期,您可以使用session.gc_maxlifetime。

通過調用session_destroy使cookie到期可能會產生不可預測的結果,因為它們可能已經過期。

在php.ini中進行更改也是一種有效的解決方案,但它使整個域的到期全局可能不是您真正想要的 - 某些頁面可能選擇保留一些cookie比其他更多。




<?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
}
?>





Links