遵循会话的最佳做法我已扩展SessionHandler
并随机重新生成会话ID(每10次机会中)。会话工作正常,我已经开始实现一些AJAX调用。然而,有一些非常随机的情况会话将失效并且用户退出,我不知道最好和最安全的解决方案。
让我带您了解所发生的事情:
假设用户“加载更多数据”并启动AJAX调用。
Browser sends headers including COOKIE, session ID is: klqlk0rldcasbos2f4li1db
会话处理程序验证了这一点,没关系,但是我们已经达到了十分之一的机会,所以我们session_regenerate_id
Server sends back new session ID: sbos2f4li1dbklqlk0rldca
在发送数据的过程中,用户在AJAX仍在运行时点击另一个页面(可能性很小,但可能会发生)。
浏览器似乎没有成功存储新的会话ID。似乎请求被取消,所有数据都被丢弃,包括新的会话ID。 (不是浏览器错误,对吧?)。
然后,由于用户已转到新页面,客户端正在发送会话ID klqlk0rldcasbos2f4li1db
而不是新的sbos2f4li1dbklqlk0rldca
。因此无效的session = logout。
我还可以在一个没有时间完全收到的页面上可靠地再现这个简单的F5。
可能的解决方案?
当我们session_regenerate_id
我们将旧ID存储在某处时,请添加
某种检查。
我们在任何期间禁用session_regenerate_id
AJAX调用。安全性略有下降,而不是真正的解决方案。
非常感谢任何输入。
更新
我一直在使用session_regenerate_id(true)
并将其设置为false(默认)解决了这个问题,但是现在我想知道如果旧会话停留在系统上这有多好以防止会话劫持?击败生成新ID的点。