4

私は情報セキュリティ コンサルタントとして Web アプリケーションの脆弱性をテストしたセキュリティのバックグラウンドを持っています。私は webdev として働き始めたばかりで、Codeigniter で書かれた最初のプロジェクトで忙しいです。

ユーザーが有効かつアクティブな2つ(またはそれ以上)の同時セッションを持つことができる複数の同時ログインの問題を解決しようとしています。これを行う方法は考えていますが、CI の経験がないので、より良い、またはより「公式な」方法があるかどうかを知りたいです。また、DB の ci_sessions テーブルに変更を加える必要がありますが、CI がそれをどのように処理するかはわかりません。

現時点では、セッション データに DB を使用しています。私の計画は、ci_sessions テーブルに追加の列を追加することです。これは、ユーザーの電子メール アドレスを格納する列です (認証後)。つまり、ユーザーが正常にログインするまでは NULL であり、その時点でユーザーの電子メール アドレスが保存されます。

計画は、ログイン時に提供された資格情報の有効性を確認し、それらが正しい場合は、同じ電子メール アドレスに対応する他のセッションのセッション テーブルを検索し、それらを削除することです。ユーザーの他のセッションが削除されると、有効な認証済みセッションを示す電子メールとセッション データが設定されます。

これはこれを行うための最良の方法ですか?

編集: もちろん、CI が新しいセッションに電子メール アドレスを設定しないため、CI が更新する代わりに現在のセッションの新しいセッション ID を作成する場合、これは機能しません。ソースに修正を加える必要があります...

4

3 に答える 3

2

Sessions.php のソース コードを調べていたところ、sess_update() の最後に次の行が見つかりました。これは、DB セッションが使用されている場合にのみ呼び出されます。

$this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));

つまり、新しいエントリを挿入する代わりに、現在の session_id が新しい session_id で更新され、他のすべての情報 (last_activity を除く) はそのまま残ります。次に、元の計画を試すことにしました。テーブルに (メールの代わりに) user_id 列を追加しました。デフォルトは NULL です。ログイン時に資格情報を確認し、指定された電子メール アドレスの user_id を (とりわけ) 返します。次に、user_id 列にその特定の ID を持つすべてのセッションを削除し、現在の session_id に関連付けられている行を更新して、このユーザーの user_id を含めます。

Chrome でログインしてから Safari でログインしてテストしたところ、Chrome セッションが強制終了されました。抜け穴がないことを確認するために、さらにテストを行う必要がありますが、これで問題が解決したようです。

ご提案いただきありがとうございます。Samutz、あなたの方法はうまくいったと確信しています。私の方法の方がオーバーヘッドが少ないことがわかりました。

于 2013-04-18T19:58:02.697 に答える
0

構成ファイルで設定します。

$config['sess_match_ip'] = true;

セッションデータを読み取るときに、ユーザーのIPアドレスと一致します

http://ellislab.com/codeigniter/user-guide/libraries/sessions.htmlを参照してください。

それが役に立てば幸い!

于 2013-04-18T16:49:09.990 に答える