<?php
// 注意:下列不是完整的代码,只是一个示例
// my_session_start() 和 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'])) {
// 尚未完全过期,可能是由于网络不稳定引起的。
// 尝试再次设置正确的会话 ID cookie。
// 注意:如果你需要移除认证标记,那么不要尝试再次设置会话 ID。
session_commit();
session_id($_SESSION['new_session_id']);
// 现在有了新的会话 ID 了。
session_start();
return;
}
}
}
function my_session_regenerate_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);
// 新的会话不需要这 2 个数据了
unset($_SESSION['destroyed']);
unset($_SESSION['new_session_id']);
}
?>