【问题标题】:Clicking links quickly causes logout (session locking?)快速单击链接会导致注销(会话锁定?)
【发布时间】:2018-09-12 23:57:29
【问题描述】:

问题:

登录后,我快速单击以在新标签中打开多个链接,第一个工作正常,但后面的无法从会话中读取user,并导致应用程序认为“没有用户数据 = 无法访问,重定向到登录”。

有人告诉我这可能是由于 PHP 的会话锁定。想法是第一页正在加载,并且通过这样做,正在阅读会话。在它完成之前,下一个正在尝试读取会话,但它仍然被第一个锁定。

如果您只是单击一个链接,然后单击另一个链接,也会发生这种情况。因为第一个链接仍然命中服务器导致它锁定会话,所以当浏览器试图将你带到第二个时,它无法读取user并认为你没有登录。

这似乎是一个非常奇怪的默认行为,我不得不想象有人提出了一个不错的解决方案,而不是“不要打开多个标签”和“点击链接时不要改变主意”。

这不会发生在我的 CakePHP 2.x PHP 5.x 应用程序上,但会发生在我的 CakePHP 3.x PHP 7.x 应用程序上。

一个建议的解决方案:

有人告诉我尝试 Redis。虽然这听起来像是一个不错的解决方案(Redis 不会锁定会话),但它删除了 beneficial aspect of session locking 并且似乎也不起作用。即使在将 CakePHP 3 应用程序设置为使用 redis 进行会话,并验证它正在将会话数据写入 redis 之后,问题仍然存在。

问题:

处理这个问题的标准方法是什么?每个 CakePHP 3.x 应用程序是否默认都有这个 bug?

注意/附加小问题:

我注意到 Cake 存储在“CAKE”下的 cookie 值在大多数页面加载时都会发生变化。该值是会话密钥(减去前缀)。这是否意味着它在每次页面加载时都设置一个新会话?如果是这样,有什么原因吗?

【问题讨论】:

    标签: php session cakephp locking cakephp-3.x


    【解决方案1】:

    PHP 中的会话锁定不是这样工作的,锁定的会话会阻止脚本执行,直到会话被解锁,它会继续并让您没有会话访问或空会话。

    如果您在每个请求上都看到一个新的会话 ID,那么 可能 是问题(或它的症状),即使用已经失效的会话 ID 的后续请求,肯定会让您离开使用空会话,即您将被注销。

    会话通常很少重新生成,例如在登录/注销时(以避免重放攻击),或会话超时时。首先,检查您的会话超时/生命周期配置 (\Cake\Network\Session::$_lifetime),并尝试在 \Cake\Network\Session::renew() 中设置断点以检查它是否被意外调用以及从何处调用。

    【讨论】:

    • 你似乎在做某事。似乎每次单击链接时都会更新会话。仍在挖掘原因。
    • 原来我正在更新会话的 AppController 中执行$this->Auth->setUser($user);。感谢您为我指明方向!
    猜你喜欢
    • 2014-12-21
    • 2013-06-09
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2017-08-15
    • 2021-12-16
    • 2020-02-17
    相关资源
    最近更新 更多