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を頻繁に送信し続ける限り、セッションを無期限に有効に保つことができます。
どう思いますか?ここで重要な何かが欠けていますか?それとも、これは見た目と同じくらい悪いセキュリティホールですか?