web-dev-qa-db-ja.com

PHPセッションタイムアウト

ユーザーが次のようにログインすると、セッションが作成されます。

$_SESSION['id'] = $id;

X分のセッションでタイムアウトを指定し、X分に達したら機能またはページリダイレクトを実行するにはどうすればよいですか?

編集:私はセッションが非アクティブのためにタイムアウトする必要があることを言及するのを忘れていました。

46
user342391

最初に、ユーザーが最後にリクエストを行った時間を保存します

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

後続のリクエストで、以前のリクエストを行った時間を確認します(この例では10分)

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

セッションの有効期限が切れると、データは存在しなくなるため、次のようになります

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

セッションがアクティブでなくなるたびにリダイレクトします。

session.cookie_lifetime を使用して、セッションCookieの有効期間を設定できます。

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

編集:セキュリティの問題のために(利便性の代わりに)セッションをタイムアウトする場合、以下のコメントが示すように、受け入れられた回答を使用してください。これはクライアントによって制御され、安全ではありません。これをセキュリティ対策とは考えていませんでした。

44
Vinko Vrsalovic

最初にセッションがまだ作成されていないことを確認し、作成されていない場合は作成します。ここでは、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';
  }
?>
5
user1473910
<script type="text/javascript">
window.setTimeout("location=('timeout_session.htm');",900000);
</script>

すべてのページのヘッダーで、サイトのテスト中に私のために働いています(サイトはまだ運用されていません)。該当するHTMLページがセッションを終了し、ユーザーに再度ログインする必要があることを通知します。これは、PHPロジックで遊ぶよりも簡単な方法のようです。このアイデアについてコメントをお願いします。私が見たことがないトラップはありますか?

2
Byterbit
<?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
Uday Hiwarale

Byterbitソリューションには問題があります:

  1. クライアントがサーバー側Cookieの有効期限を制御することは、セキュリティの問題です。
  2. サーバー側で設定された有効期限のタイムアウトがクライアント側で設定されたタイムアウトよりも小さい場合、ページはCookieの実際の状態を反映しません。
  3. 開発段階での快適さのためであっても、リリース段階での適切な動作(タイミング)を反映しないため、これは問題です。

cookieの場合、session.cookie_lifetimeを使用して有効期限を設定することは、設計上およびセキュリティ上適切なソリューションです。セッションを期限切れにするには、session.gc_maxlifetimeを使用できます。

session_destroyを呼び出してCookieを期限切れにすると、すでに期限切れになっている可能性があるため、予測できない結果が生じる可能性があります。

php.iniに変更を加えることも有効な解決策ですが、ドメイン全体の有効期限をグローバルに設定しますが、これは実際に必要なものではない可能性があります。

1
Michael Badichi
    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/1245

0
khaled_tn
<?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
Dominic Ceraso