Codeigniter:セッションを最終的に安定させる(主に認証用)

Codeigniterのセッションはすべての人に適しています。 確かに、それらは非常に便利に作られています。特に、セッションをデータベースに保存する場合(これが唯一の真のものだと思います)。 Cookieは暗号化され、Cookieには識別子しかありません。 これらはuser_agentにバインドされ、オプションでIPにバインドされます。 いい、安全。



しかし、これらには非常に重大な欠点があります。セッションの寿命はlast_activityフィールドから計算されます。 これは、2日間の期限切れセッションがある場合、last_activity <time()-172800でセッションにアクセスすると、セッションが削除され、新しいセッションが開始されることを意味します。 したがって、ユーザーが毎回サイトにログインする必要がないように、last_activityは最新の状態に保つ必要があります。

last_activityフィールドは、2つの場合に更新されます。セッションに新しい何かを書き込むとき、またはセッションが更新されるとき(デフォルトでは、構成で指定されたlast_activityに関連して、5分ごとに再び)。 そして主な問題は、セッションを更新すると、 session_idが変更され 、ユーザーの現在のセッションが中断されると、新しいセッションが開始されることです。



率直に言って、この種のセッションの振る舞いにより、私は驚きの状態になりました。 このような現実では、認証サポートツールとしてネイティブセッションを使用することは不可能に思えます...



問題は「燃える」ことであり、Codeigniterフォーラムでよく記憶されていますが、どこでもインテリジェントなソリューションを見たことはありません。



しかし、ご存知のとおり、目標はフィクションであるため、簡単な解決策が見つかりました。



最初に行うことは、 config / config.phpで 、セッションの更新頻度をその有効期限の時間に指定することです:

=================

$config['sess_time_to_update'] = $config['sess_expiration'];





=================

次に、 フックを有効にします。

=================

$config['enable_hooks'] = TRUE;





=================



次に、 config / hooks.phpで

=================

$hook['post_controller_constructor'] = array(

'class' => '',

'function' => 'sess_update',

'filename' => 'sess_update.php',

'filepath' => 'hooks'

);






=================

(フックポイントは、原則として任意であり、主なことはページが開かれるたびに実行されることです)



そして、フックでsess_update.phpを作成します

=================

<?php

function sess_update()

{

$CI =& get_instance();

if ($CI->session->userdata('last_activity')< time() - 300) {

$CI->session->set_userdata('last_activity', time());

}

}






=================

関数は5コペックと同じくらい簡単です:codeigniterスーパーオブジェクトへのリンクを取得し、セッションの最後の更新から5分が経過したかどうかを確認します(毎回追加のリクエストでデータベースをストームしないように)。 。



基本的に、効果は$ config ['sess_time_to_update']で5分を指定するのと同じですが、同時にセッション自体は無傷のままで、データはどこにも行かず、許可ユーザーは翌日または2日で到着します(値に応じて$ config ['sess_expiration'])は承認されたままになります。



All Articles