php - 我不明白为什么 session_regenerate_id 对低连接很危险?
问题描述
我正在研究我的网站的安全性,我会理解为什么应该谨慎使用 session_regenerate_id。在 php 手册文档(https://www.php.net/manual/en/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/en/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”可能是攻击?而且我不明白为什么我们应该删除一个会话,如果它可能是一个网络问题......这会导致连接丢失吗?我不明白为什么我们应该提出例外?有人可以帮助我吗?
解决方案
该文本试图说“如果设置了销毁的时间戳,并且该时间戳超过 5 分钟,那么可能有人拿到了一个 cookie 并试图劫持一个会话。如果它不到 5 分钟,那就是可能只是遇到网络问题的用户。” 因此,如果它是会话劫持,您希望删除会话并在某处记录错误。如果只是网络问题,则要更新会话。还值得注意的是,示例代码else
在if ($_SESSION['destroyed'] < time()-300)
块上缺少一个。
推荐阅读
- vb.net - 如何在 Virtual Studio 中将数据写入一行?(MS Access 数据库文件"
- r - 如何修复“$<-.data.frame`中的错误(`*tmp*`, "x", value = 1L):replacement 有 1 行,数据有 0" 使用 uptR 时?
- sas - 在 SAS Enterprise Guide 中返回 0 的回归结果
- azure - Azure 数据工厂 v2 的 Azure Active Directory 应用程序与 Azure Batch 服务
- spring - 响应来自哪里 - Nginx?应用程序?Kubernetes?其他?
- javascript - 在 Reactjs 中使用 Splice 删除所需的元素 onClick
- java - AlarmManager:设置停止通知的时间
- jquery - 在网络服务器上发布时,jQuery 提交会成倍增加
- c# - Rider“外部别名”和“使用”支持
- linq - 如何使用包含布尔值和子列表的 linq 合并行?