2

PHPWebアプリに「他のアクティブなセッションを閉じる」ボタンを追加したいと思います。

MySQLテーブルで(userid、sessionid、expiration)を追跡し、次の方法でセッションを強制終了することを考えています。

$currentsessionid=session_id();
foreach($othersessions as $session){
    sessionid($session['sessionid']);
    session_start();
    session_destroy();
}
mysql_query("DELETE FROM sessions WHERE userid = $currentuserid AND sessionid <> $currentsessionid");
session_id($currentsessionid);
session_start();

ユーザーがログに記録されている場合、各session_start()の後にテーブルも更新され、期限切れのエントリが削除されます。

期限切れのエントリは、ユーザーがログインするたびに削除されます。

これは適切なアプローチですか?助言がありますか?

4

1 に答える 1

2

PHPでは、セッションは通常分離されています。独自のセッションハンドラーを作成し、セッション(およびいくつかの追加の追跡情報)をデータベースに書き込んで、これを管理しやすくする必要があります。

たとえば、質問にあるように、userid。次に、特定のユーザーのセッションを検索できます。

必要なもう1つのフィールドはタイムスタンプです。これにより、セッションを期限切れにすることができます。たとえば、X時間より古い場合は、セッションを破棄します。

必要に応じて、ユーザーが既存のセッションを取得しているかどうかを確認し、古いセッションをインポートすることもできます。ただし、これはセキュリティに影響を与える可能性があります。実際のユーザーではなく、攻撃者がログオンしたときに何が起こるかを考える必要があります。

攻撃者は有効なユーザーをシステムから追い出すことさえできますか?それは防ぐべきです。

また、新しいセッションIDで前のセッションのセッションデータを引き継ぐことができることも考慮に入れてください。これは、と同様にsession_regenerate_id()、ログインは常にセッションIDを再生成する必要があります。また、ログアウトやその他の重要な手順(たとえば、電子メールアドレスを変更する前の再認証)も再生成する必要があります。

于 2012-12-21T22:01:48.713 に答える