<?php
// 注意: このコードは完全に動作するわけではありません。一例です!
// my_session_start() and my_session_regenerate_id() によって、
// 不安定なネットワークによるセッションの消失を避けています。
// それに加えて、このコードは攻撃者から、盗まれたセッションを利用した
// 攻撃を防ぐ可能性もあります。
function my_session_start() {
session_start();
if (isset($_SESSION['destroyed'])) {
if ($_SESSION['destroyed'] < time()-300) {
// 通常は起こるべきではない。攻撃や不安定なネットワークによる可能性がある
// このユーザーのセッションから、全ての認証ステータスを削除
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new DestroyedSessionAccessException);
}
if (isset($_SESSION['new_session_id'])) {
// 完全に expire してはいない。
// Cookie が不安定なネットワークによって失われた可能性がある。
// 適切なセッションIDのクッキーを設定するためにリトライする。
// 注意: 認証フラグを削除したい場合は、セッションIDを再度設定しようとしてはいけない。
session_commit();
session_id($_SESSION['new_session_id']);
// 新しいセッションIDが存在しているはず
session_start();
return;
}
}
}
function my_session_regenerate_id() {
// 不安定なネットワークのために、セッションID が設定されなかったときは、
// 新しいセッションID が、適切なセッションIDに設定されることが必須。
$new_session_id = session_create_id();
$_SESSION['new_session_id'] = $new_session_id;
// 破棄された時のタイムスタンプを設定
$_SESSION['destroyed'] = time();
// 現在のセッションを書き込んで閉じる
session_commit();
// 新しいセッションを新しいセッションIDで開始
session_id($new_session_id);
ini_set('session.use_strict_mode', 0);
session_start();
ini_set('session.use_strict_mode', 1);
// 新しいセッションには、以下の情報は不要
unset($_SESSION['destroyed']);
unset($_SESSION['new_session_id']);
}
?>