phpのセッション
Session
セッションID はユーザーの権限が上昇したとき、再生成する必要がある。
期限切れのセッションを突然削除するのではなく、 開発者は短い期限切れの時間(タイムスタンプ)を $_SESSION に設定し、 セッションデータにアクセスすることを自分で禁止すべきです。
短い期限切れの時間(タイムスタンプ)を $_SESSIONに設定し、セッションデータへのアクセスを自分で禁止する。
session_regenerate_id()の呼び出し後、古いセッションへのアクセスをすぐに禁止してはいけない。
安定したネットワークの場合、数秒後、
不安定のネットワークの場合、2,3分後など
ユーザーのアクセスが期限切れのセッションだった場合、 アクセスを拒否するべきです。攻撃されている可能性があるすべてのユーザーから、 認証済みのステータスを削除することも推奨します。
期限切れのセッションへのアクセスが合った場合、認証済みのステータスも削除する。
期限切れのセッションは早く削除するべき
期限切れのセッションへのアクセスは、できるだけ早く削除するべき。
自動ログイン
開発者は有効期間が長いセッションを、自動ログインに使ってはいけません。 なぜなら、セッションが盗まれるリスクが増えるからです。 自動ログイン機能は、開発者が実装すべきです。
有効期間が長いセッションで自動ログインしてはいけない。
setcookie() を使い、 セキュアなワンタイムハッシュを自動ログインのキーとして使います。 SHA-2 より強いセキュアなハッシュを使います。 たとえば、 random_bytes() や /dev/urandom で生成したランダムデータを SHA-256 またはそれより強いハッシュ関数と一緒に使います。
自動ログインキー
一度きりの自動ログインキーを使う。
cookieにセットする。
ユーザーを認証したら、新しい自動ログインキーをセットする。
セッションのガベージコレクション
セッションデータのガベージコレクション
PHP がセッションを開始したとき、あるいは session_start() を実行したときにコールされます。
他参考
セッションの設定
session.gc_maxlifetime
session.gc_maxlifetime は、データが 'ごみ' とみなされ、消去されるまでの秒数を指定します。 ガベージコレクション (ごみの収集) は、 セッションの開始時に行われます
セッションデータの有効期間
session.gc_divisor
session.gc_probabilityの組み合わせで すべてのセッションの初期化過程でgc(ガーベッジコネクション)プロセス も始動する確率を制御します
リクエストごとにgcが実行される確率を設定する。
ただ、sessionの有効期限が上記の秒数経過したからといって、即座にセッションファイルが削除されるわけではありません。
また、sessionはブラウザを閉じると削除されますが、cookieを使うことで、ブラウザを閉じても保持することが可能です。その場合は、cookieの保持期間も設定します。
session.gc_maxlifetimeが経過しても必ず、gcが実行されるわけではない
デフォルトは、1/100
gc_probability/gc_divisor で計算。
1/100は各リクエスト毎に1%の確率でGCされう。
session.gc_divisorのデフォルトは100です。 0 より大きな値でなければいけません。
必ず、gcを実行する場合は以下を設定する
session.gc_probability = 1
session.gc_divisor = 1
ログアウト
cookieの削除まではしなくても良い
code:php
session_start();
$_SESSION = array();
session_destroy()
認証
ロールの仕様が変わることを考慮して、ロールは、セッションに保存しない
参考
Debian系のPHPのGCについて
注意、Debian系はphpのgc機能はオフになっている。
gc_probabilityが0となっている。
code:php.ini
; Defines the probability that the 'garbage collection' process is started on every
; session initialization. The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts on each request.
; Default Value: 1
; Development Value: 1
; Production Value: 1
; Debian Default Value: 0
; This is disabled in the Debian packages due to the strict permissions
; on /var/lib/php. Instead, GC is performed through /etc/cron.d/php,
; which uses the session.gc_maxlifetime setting. Please, check
; /usr/share/doc/php8.2-common/README.Debian.gz for further reference.
session.gc_probability = 0
/usr/share/doc/php8.3-common/README.Debian.gz
Session storage
----------------------------------------------------------------------
Session files are stored in /var/lib/php/sessions. For security
purposes, this directory is unreadable to non-root users. This means
that PHP running from Apache HTTP Server, for example, will not be
able to clean up stale session files. Instead, we have a cron job
run every 30 minutes that cleans up stale session files;
/etc/cron.d/php. You may need to modify how often this runs, if
you've modified session.gc_maxlifetime in your php.ini; otherwise,
it may be too lax or overly aggressive in cleaning out stale session
files.
WARNING: If you modify the session handling in any way (e.g. put
session files in subdirectories, use different session handler), you
always have to check and possibly disable or modify the session
cleanup cron job that is located in /etc/cron.d/php.
gc_maxlifetimeを変更する場合、cronの実行間隔を変更する必要があるかもしれないということ?
cronのタイミングを変更すれば良いのではなくて?