2

CodeIgniterのセッション処理メカニズムを調べているときに、かなり心配していることがわかりました。

$expire = $this->now - $this->sess_expiration;

$this->CI->db->where("last_activity < {$expire}");
$this->CI->db->delete($this->sess_table_name);

CIは、固定の非可変有効期限フィールドではなく、last_activityに基づいてセッションの有効期限を実際に決定しているようです。

ここでの問題は、セッションが更新されるたびにlast_activityがnow()に更新されることです。したがって、CIのデフォルトを使用していて、7200秒(2時間)続くセッションが300秒(5分)ごとに更新されると仮定します。

セッションは、最後の更新から5分後に更新が必要であるというフラグが立てられます。したがって、ユーザーがこの5分後、ただし2時間前にセッションCookieを送信すると、CIは、last_activityにより、この瞬間からさらに2時間続くようにセッションを延長します。 now()に更新されます。

これは、ユーザーがアクティブでセッション更新をトリガーし続ける限り、その期間が無期限に延長され、有効期限設定が事実上役に立たなくなるため、私には大きなセキュリティリスクのように思われます。更新を10秒に設定し、有効期限を20に設定して、これをテストしました。10秒ごとに更新を押し続けている限り、セッションが期限切れになることはありません。

攻撃者がログインCookieを盗み、有効なセッションを確立した場合を想像してみてください。ログインCookieを無効にしても、攻撃者はCookieを頻繁に送信し続ける限り、セッションを無期限に有効に保つことができます。

どう思いますか?ここで重要な何かが欠けていますか?それとも、これは見た目と同じくらい悪いセキュリティホールですか?

4

1 に答える 1

1

コメントから要点がわかると思いますが、単に回答を投稿すると、発見したのは適切な機能です。

セッションは、最初の特定の時点から + 7200 秒まで作成されず、「拡張」されるように設定されています。あなたが何かに取り組んでいる人で、アクティブなときに突然ログアウトされた場合、それはややばかげています。

別の方法として、説明したことを実行したい場合は、 を拡張してそのCI_Session特定のメソッドを変更し、 として保存しMY_Sessionます。

ここで詳細を参照してください: http://codeigniter.com/user_guide/general/core_classes.html

于 2012-08-19T06:15:28.953 に答える