我已经实现了自己的SessionHandlerInterface,它可以将用户会话和持久性会话读写到Redis服务器。用户会话cookie设置为在浏览器关闭时过期,因此需要清除关联的Redis会话。我可以通过设置例如30分钟的到期时间来进行清理,例如,这将导致用户在非常长的30分钟内收到一个新会话,而不会由于持久会话的存在而中断。用户登录时,我会自动发出一个永久cookie,使他们保持登录状态几个月。
如何防止D / DoS攻击,即用户以编程方式获取用户会话cookie和/或持久性cookie,将其删除,然后继续无限期地请求和删除该cookie?本质上,在Redis中创建无限数量的孤立用户或持久会话,这些最终将被清除。即使我将会话cookie的寿命减少到1分钟以某种程度降低风险,它仍然会留下持续的cookie问题,使它们几个月都不会过期。这很容易使我的会话管理器崩溃,并阻止所有用户登录。
我知道防火墙已经为此内置了解决方案,但是我想知道如何在应用程序级别减轻这种攻击。
此问题之前已提出:Orphaned Session Management Records in Database. How to handle the issue? DB Stability Risk
答案 0 :(得分:0)
我相信我有一个可以利用防火墙之外的解决方案。
在Redis中,对于用户会话和持久会话,我将利用哈希并将用户ID与任何相关信息一起存储。在必须创建新用户或持久性会话时,将对存在的任何用户和/或持久性会话(取决于是否正在请求用户会话或持久性会话)以及是否存在的会话进行Redis查找。尚未过期,请覆盖它或删除它并创建一个新的。
这应确保用户在任何时候都不能存在多个用户会话或持久会话,并且应该使任何DoS会话攻击无效。