4

次の問題があります。

  1. ユーザー X は、session_id 1000 を使用して PC1 にログインします。離れましたが、ログアウトを忘れました。
  2. ユーザー X が PC2 にログインし、session_id 1001 を使用します。
  3. セッション 1000 がタイムアウトする前に、ユーザー Y は PC1 でユーザー X として session_id 1000 でアクセスできます。

このようにして、2 人のユーザーが同じユーザーとして、異なる PC で、異なるセッション ID でアクセスできます。私がしたいのは、ユーザーがログインするたびに新しい session_id を保存し、以前に保存した session_id を削除することです。しかし、現在のセッションを変更せずに、ID を指定してセッション ファイルを削除または変更する方法がわかりません。

つまり、私は次のことをしたい:

  1. ユーザー X は、session_id 1000 で PC1 にログインします。スクリプトは、1000 を last_session_id として保存します。ログアウトしましたが、ログアウトするのを忘れていました。
  2. session_id 10001 で PC2 に同じユーザーがログインします。スクリプトは last_session_id (1000) を取得し、そのセッション情報を削除します。次に、1001 を新しい last_session_id として保存します。
  3. ユーザー Y は、session_id 1000 で PC1 にアクセスしますが、情報が削除されているため、X としてアクセスできません。

*session_id(old_session)* は正しく機能しますか? または、その関数は現在のセッションIDの名前を変更するだけで、値を維持しますか?

前もって感謝します。

4

2 に答える 2

5

私はこれを見つけました

$session_id_to_destroy = $sessionid;
// 1. commit session if it's started.
if (session_id()) {
    session_commit();
}

// 2. store current session id
session_start();
$current_session_id = session_id();
session_commit();

// 3. hijack then destroy session specified.
session_id($session_id_to_destroy);
session_start();
session_destroy();
session_commit();

// 4. restore current session id. If don't restore it, your current session will refer to the session you just destroyed!
session_id($current_session_id);
session_start();
session_commit();

それは私にとって完璧に機能しました。

于 2014-11-17T21:14:42.950 に答える
0

私の経験から、セッションに関連するデータを格納するために 1 つのテーブルを使用します。テーブルには、userID、lastSessionID のフィールドが 2 つ以上含まれています。お使いのシステムでは、sessionId と userID を取得し、データベースに保存されている最後の sessionID と比較するだけで、同じ userID を参照できます。U が同じ sessionID を取得した場合は続行しますが、異なる場合はページをリダイレクトしてログアウトします。ただし、この方法を使用するには、ユーザーがログインするたびにユーザー ID とセッション ID をデータベースに保持する必要があります。

于 2012-11-19T02:46:40.393 に答える