web-dev-qa-db-ja.com

PHP-ブラウザを閉じた後にセッションを破棄する

この質問には複数の重複がありますが、適切な解決策を見つけることができませんでした。助けが要る。

構成ファイルでini_set('session.cookie_lifetime', 0);を使用しました。

しかし、ブラウザを閉じたときにセッションを破棄することはできません。

アプリケーション電流の流れ:

1)ユーザーが有効な場合、認証ページで、session_regenerate_id(true);を使用して新しいセッション識別子を生成します

2)session_start();を使用して新しいセッションを開始するwelcome.phpに制御が移ります

3)ログアウトページのコードは

      $_SESSION = array();
      if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
      );
     }
    // Finally, destroy the session.
    session_destroy();
11
Shri

最善の方法は、セッションを閉じることです。特定の時間間隔の後にそのセッションに対する応答がない場合です。その後、閉じます。この投稿をご覧ください。問題が解決することを願っています。 PHPでセッションタイムアウトを変更する方法 "

6
Ankit

キープアライブを使用します。

ログイン時:

session_start();
$_SESSION['last_action'] = time();

数秒(たとえば20秒)ごとのajax呼び出し:

windows.setInterval(keepAliveCall, 20000);

サーバー側keepalive.php:

session_start();
$_SESSION['last_action'] = time();

他のすべてのアクション:

session_start();
if ($_SESSION['last_action'] < time() - 30 /* be a little tolerant here */) {
  // destroy the session and quit
}
6
colburton

これを行うにはさまざまな方法がありますが、サーバーはブラウザが閉じられたことを検出できないため、それを破壊するのは困難です。

  • タイムアウトセッション。

現在の時間で新しいセッションを作成するか、現在のセッションに時間変数を追加します。起動時に確認するか、セッションを削除する必要があるかどうかを確認するアクションを実行します。

_session_start();
$_SESSION["timeout"] = time();
//if 100 seconds have passed since creating session delete it.
if(time() - $_SESSION["timeout"] > 100){ 
    unset($_SESSION["timeout"];
}
_
  • アヤックス

Javascriptにセッションを削除するajax呼び出しを実行させます。onbeforeunload()は、ユーザーがページを離れたときに最終アクションを呼び出すjavascript関数です。何らかの理由で、これは常に機能しません。

  • 起動時に削除します。

ページを閉じた後、起動時に常にユーザーにログインページを表示する場合は、起動時にセッションを削除するだけです。

_<? php
session_start();
unset($_SESSION["session"]);
_

おそらくさらにいくつかあります。

4
kpp

これはあなたを助けるかもしれません、

session_set_cookie_params(0);
session_start();

セッションCookieは破棄されます...ブラウザが開くまでセッションは良好です。ご覧ください http://www.php.net//manual/en/function.session-set-cookie-params.php これはあなたを助けるかもしれません。

2
Adil Abbasi

HTTPリファラーを使用したもう1つの「ハッキング」があります(ブラウザーウィンドウが閉じられたと仮定して、現在のリファラーのドメイン名と現在のページのドメイン名が一致しません)。

session_start();
$_SESSION['somevariable'] = 'somevalue';

if(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_Host) != $_SERVER["SERVER_NAME"]){
    session_destroy();
}

これにはいくつかの欠点もありますが、何回か助けてくれました。

1
DTT

JavaScriptを使用してそれを行うには、サーバーへのajaxリクエストをトリガーして、参照タブ、ウィンドウ、またはブラウザーを閉じたときに発生するonbeforeunloadイベントでセッションを破棄します。

1
itzmukeshy7

次のコードを使用して、セッションを破棄します。

 <?php
    session_start();
    unset($_SESSION['sessionvariable']);
    header("Location:index.php");
    ?>
0
user3774008

各ログインでセッションIDを変更する場合は、ログインプロセス中に必ずsession_regenerate_id(true)を使用してください。

<?php
session_start();
session_regenerate_id(true);
?> 
0
Braike dp