防止 PHP/Redis 会话 D/DoS 攻击

Prevent PHP/Redis Session D/DoS attacks

我已经实现了我自己的 SessionHandlerInterface,reads/writes 用户会话和到 Redis 服务器的持久会话。用户会话 cookie 设置为在浏览器关闭时过期,因此需要清理关联的 Redis 会话。例如,我可以通过设置 30 分钟的到期时间来清理它,这将导致用户在 30 分钟后收到一个新会话,而不会由于持久会话的存在而中断。当用户登录时,我会自动发出一个持久性 cookie,让他们保持登录状态几个月。

如何防止 D/DoS 攻击,即用户以编程方式获取用户会话 cookie and/or 持久性 cookie,将其删除,然后继续无限期地请求和删除 cookie?本质上是在 Redis 中创建无限数量的孤立用户或持久会话,这些会话最终将被清理。即使我将会话 cookie 的生命周期减少到 1 分钟以稍微降低风险,它仍然会留下一个持久的 cookie 问题,它们不会设置为几个月。这很容易使我的会话管理器崩溃并阻止所有用户登录。

我知道防火墙为此内置了解决方案,但我想知道如何在应用程序级别减轻这种攻击。

这个问题之前有人提出过:Orphaned Session Management Records in Database. How to handle the issue? DB Stability Risk

我相信我有一个在利用防火墙之外的解决方案。

在用于用户会话和持久会话的 Redis 中,我将利用哈希并将用户 ID 与任何相关信息一起存储。在必须创建新用户或持久会话时,将在 Redis 中查找任何存在的用户 and/or 持久会话(取决于是请求用户会话还是持久会话),如果一个存在尚未过期的,覆盖它或删除它并创建一个新的。

这应该保证一个用户在任何时候都不能存在超过一个用户会话或持久会话,并且应该使任何 DoS 会话攻击无效。