我正在保护我的网站的安全,我会理解为什么应该谨慎使用session_regenerate_id。 在php手册doc(https://www.php.net/manual/fr/function.session-regenerate-id.php)中,他们说:
当前,session_regenerate_id无法很好地处理不稳定的网络,例如移动和WiFi网络。因此,您可能会通过调用session_regenerate_id来丢失会话。
您不应立即销毁旧会话数据,而应使用销毁时间戳记并控制对旧会话ID的访问。否则,对页面的并发访问可能导致状态不一致,或者您可能丢失了会话,或者可能导致客户端(浏览器)端竞争,并可能不必要地创建了许多会话ID。立即删除会话数据也会禁用会话劫持攻击检测和预防。
我不明白为什么此功能可能意味着失去连接。 我们向服务器发送一个请求,他更改SID(使用旧值初始化$ _SESSION并在save_file位置创建文件),以便他可以向客户端发送cookie。
任何人都可以向我解释我们在哪里丢失会议的机会? 我真的对此感到困惑,但是为了解决这个问题,我会理解这个问题。
在此先感谢所有:D
Ps:我也浏览过https://www.php.net/manual/fr/function.session-regenerate-id.php上的文档,但我不理解第二个示例:
function my_session_start() {
session_start();
if (isset($_SESSION['destroyed'])) {
if ($_SESSION['destroyed'] < time()-300) {
// Ne devrait pas se produire habituellement. Cela pourrait être une
// attaque ou en raison d'un réseau instable. Supprimez tout l'état
// d'authentification de cette session utilisateurs.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new DestroyedSessionAccessException);
}
if (isset($_SESSION['new_session_id'])) {
// Pas encore complètement expiré. Pourrait être perdu cookie par réseau instable.
// Essayez à nouveau de définir le cookie d'ID de session approprié.
// Remarque: n'essayez pas de redéfinir l'ID de session si vous
// souhaitez supprimer l'état d'authentification.
session_commit();
session_id($_SESSION['new_session_id']);
// Nouvel ID de session doit exister
session_start();
return;
}
}
}
为什么“ time()-300”可能是攻击? 而且我也不明白,如果这可能是网络问题,为什么我们应该删除一个会话...这将导致连接丢失?我不明白我们为什么要举个例子呢?有人可以帮助我吗?
答案 0 :(得分:-1)
该文本试图说“如果设置了已销毁的时间戳,并且该时间戳早于5分钟,那么可能有人拿到了Cookie并试图劫持会话。如果少于5分钟,旧的,可能只是用户遇到网络问题。”
因此,如果它是会话劫持,则要删除该会话并将错误记录在某处。如果仅仅是网络问题,则要更新会话。
同样值得注意的是,示例代码在else
块上缺少if ($_SESSION['destroyed'] < time()-300)
。