非常に基本的なphpセッションログインスクリプトがあります。特定のユーザーを強制的にログアウトさせるか、すべてのユーザーを強制的にログアウトさせたい。
Webサイトに対して行われたすべてのセッションを読み取り、一部またはすべてのセッションを破棄するにはどうすればよいですか?
強制的にPHPを実行して、すべてのセッションを削除することができます
ini_set('session.gc_max_lifetime', 0);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
PHP=は、すべてのセッションを0秒のライフタイムとクリーンアップされる確率100%として扱うように強制します。
欠点は、これを最初に実行する不運なユーザーが長いポーズを取得する間、PHPがクリーンアップを行うことです。特に、通過するセッションファイルが多数ある場合です。
特定のユーザーの場合、セッションハンドラーにコードを追加する必要があります。
if ($_SESSION['username'] == 'user to delete') {
session_destroy();
}
PHPのガベージコレクターは制御できないため、「ユーザーX以外のすべてのセッションを削除する」などのパラメーターを指定することはできません。セッションファイルの最終変更/最終アクセスタイムスタンプを厳密に調べ、max_lifetime設定と比較します。セッションデータは実際には処理されません。
session_save_path()
を使用して、PHPがセッションファイルを保存するパスを検索し、 unlink()
。
このコードは、 official PHP site 、および別のよく書かれた SOのスニペット に基づいています。
<?php
// Finds all server sessions
session_start();
// Stores in Array
$_SESSION = array();
// Swipe via memory
if (ini_get("session.use_cookies")) {
// Prepare and swipe cookies
$params = session_get_cookie_params();
// clear cookies and sessions
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Just in case.. swipe these values too
ini_set('session.gc_max_lifetime', 0);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
// Completely destroy our server sessions..
session_destroy();
?>
うまくいく。 NGinxのようなサーバーでは、電源を切ったり、キャッシュを消去したり、メモリリセットをスワイプしたり、ログをクリアしたり、一時的な使用を削除したりできます。メモリーの制限を下げます。
これは、セッションストレージに依存します。
PHPセッションストレージを使用している場合、サーバーの一時ディレクトリにある可能性があります。選択したファイルを削除すると、セッションが「強制終了」されます。ただし、サーバーが実行状態の場合、そのセッションファイルはHTTPプロセスによって占有されているため、削除できません。下の画像をご覧ください。「+〜」で始まるファイルはすべてセッションファイルです。
より良い解決策は、データベースセッションストレージを使用し、そこから選択したセッションを削除することです。チェックアウトできます HTTP_Session2
複数の コンテナ があります。
allセッションを一度にクリアするには、どの _session.save_handler
_ がセッションの保存と検索に使用されているかを最初に知る必要があります。 _session.save_path
_ すべてのセッションを削除するため。現在のセッションのみを削除するには、 session_destroy()
のドキュメント を参照してください。
標準ファイルおよびmemcached保存ハンドラーを使用してすべてのセッションを削除する一般的な例を次に示します。
_foreach(glob(ini_get("session.save_path") . "/*") as $sessionFile) {
unlink($sessionFile);
}
_
_$memcached = new Memcached;
$memcached->addServers($listOfYourMemcachedSesssionServers);
// Memcached session keys are prefixed with "memc.sess.key." by default
$sessionKeys = preg_grep("@^memc\.sess\.key\.@", $memcached->getAllKeys());
$memcached->deleteMulti($sessionKeys);
_
もちろん、大規模なセッションストレージのクリーンアップには時間がかかり、通常のリクエストライフサイクルで不注意な副作用が生じる可能性があるため、通常のHTTPクライアントリクエストから帯域外でのみこれを行うことを検討する必要があります。
ユーザーがログインするたびに、生成されたログインセッションと同じ値を持つトークンを含むtxt
ファイルを比較として作成します。
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$token = sha1(uniqid(mt_Rand(), true));
if($everything_is_valid) {
// Set login session
$_SESSION[$_POST['username']] = $token;
// Create token file
file_put_contents('log/token.' . $_POST['username'] . '.txt', $token);
// Just to be safe
chmod('log/token.' . $_POST['username'] . '.txt', 0600);
}
}
ログインしているユーザーの確認:
if(isset($_SESSION['charlie']) && file_exists('log/token.charlie.txt') && $_SESSION['charlie'] == file_get_contents('log/token.charlie.txt')) {
echo 'You are logged in.';
}
したがって、このcharlie
ユーザーを強制的にログアウトさせる場合は、トークンファイルを削除するだけです。
// Force logout the `charlie` user
unlink('log/token.charlie.txt');
私はこのコードが非常に有用であることがわかり、本当にうまくいきました
<?php
$path = session_save_path();
$files = glob($path.'/*'); // get all file names
foreach($files as $file){ // iterate files
if(is_file($file))
unlink($file); // delete file
}
?>
Taufikの答えは私が見つけることができる最高のものです。
ただし、さらに変更することができます
ユーザーを認証し、セッション変数を作成したら、次の行を追加します。
$token = "/sess_" . session_id();
file_put_contents('log/' . $_SESSION['id'] . '.txt', $token);
Cronジョブの実行中または管理者の要求によってユーザーを強制的にログアウトさせる必要がある場合:
$path = session_save_path();
$file = file_get_contents('log/xxx.txt'); // xxx is user's id
$url = $path.$file;
unlink($url);