簡體   English   中英

PHP 會話超時

[英]PHP Session timeout

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

$_SESSION['id'] = $id;

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

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

首先,存儲用戶上次發出請求的時間

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

在隨后的請求中,檢查他們在多久之前提出了上一個請求(在此示例中為 10 分鍾)

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

當會話過期時,數據不再存在,所以像

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

每當會話不再活動時將重定向。

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

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

編輯:如果您出於安全考慮(而不是方便)將會話超時,請使用已接受的答案,如下面的評論所示,這是由客戶端控制的,因此不安全。 我從不認為這是一種安全措施。

只需先檢查會話尚未創建,如果未創建,則創建一個。 在這里,我僅將其設置為 1 分鍾。

<?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';
  }
?>
<script type="text/javascript">
window.setTimeout("location=('timeout_session.htm');",900000);
</script>

在網站測試期間,每個頁面的標題都對我有用(該網站尚未投入生產)。 它所落入的 HTML 頁面結束會話,只是通知用戶需要再次登錄。 這似乎比玩 PHP 邏輯更簡單。 我很想對這個想法發表一些評論。 有什么我沒見過的陷阱嗎?

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

字節解決方案是有問題的,因為:

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

來源: http : //www.daniweb.com/web-development/php/threads/124500

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM