会话重新生成导致快速AJAX调用的过期会话

时间:2016-07-14 11:39:04

标签: php ajax codeigniter

我的应用程序是使用Codeigniter Framework和memcached会话处理程序的完整AJAX网页。

有时,它会发送大量异步调用,如果会话必须重新生成其ID(以避免会话固定安全问题),会话cookie的更新速度不够快,而且由于会话ID过期,某些AJAX调用失败。

这是我为清楚显示问题所做的示意图: enter image description here

我走过了类似的线程(例如this one),但答案并没有真正解决我的问题,我无法禁用安全性,因为我的应用程序中只有AJAX调用。

尽管如此,我有一个想法,我希望在入侵Codeigniter会话处理程序类之前有一个意见: 想法是管理2个同时会话ID一段时间,例如30秒。这将是最大请求执行时间。因此,在会话重新生成后,服务器仍将接受先前的会话ID,并切换到新会话。 使用相同的图片,如下所示:

enter image description here

2 个答案:

答案 0 :(得分:2)

首先,您提出的解决方案非常合理。事实上,the people at OSWAP建议:

  

Web应用程序可以实现额外的续订超时,之后将自动续订会话ID。 (...)以前的会话ID值在一段时间内仍然有效,   在客户知道新的安全间隔之前,提供安全间隔   ID并开始使用它。那时,当客户端切换到   当前会话中的新ID,应用程序使其无效   以前的身份证。

不幸的是,这不能用PHP的标准会话管理来实现(或者我不知道如何做到这一点)。然而,在a custom session driver 1 中实现此行为不应构成任何严重问题。

我现在要做一个大胆的声明:定期重新生成会话ID的整个想法都被打破了。现在不要误会我的意思,在登录时重新生成会话ID(或者更确切地说,as OSWAP put it,在“权限级别更改”)确实是对session fixation的良好防御。

但是定期重新生成会话ID 会带来比它解决的问题更多的问题:在两个会话共存的时间间隔内,它们必须同步,否则运行风险会从到期会话中丢失信息。

对简单的会话盗窃有更好(更容易)的防御:使用SSL(HTTPS)。定期会话续约应视为此攻击媒介的the poor man's workaround

1 link to the standard PHP way

答案 1 :(得分:1)

您的问题似乎与请求的实际速度相关(尽管它是一个促成因素),但更多的是并发性。 如果我理解正确,你的javascript应用程序会进行许多(异步)ajax调用 - 快速(大概是爆发) - 有时其中一些因会话失效而失败,因为你认为是请求速度问题。 我认为问题是你实际上有几个并发请求到服务器,而第一个会话更新其他会话基本上看不到它,因为请求已经发出并等待服务器处理。

这个问题当然只有在同时为同一个用户做几次请求时才会显现出来。

现在真正的问题 - 您的应用程序业务逻辑对此有何要求?

在我看来,您正试图为“业务”找到技术解决方案。问题。我的意思是,要么你误解了你的要求,要么就是没有那么好的想法/指定。

我建议你尝试以下一些方法:

  • 问问自己这些多个同步请求是否可以合并到一个

  • 深入了解要求并尝试找到你做你所做的事的真正原因,也许这没有真正的商业理由

  • 每次在您触发一系列请求之前,都会触发“刷新”。 ajax请求获取新会话,并且仅在成功时继续执行所有其他请求

希望我写的一些内容有助于指导您解决问题。 祝你好运