当将来设置客户端时钟时,PHP会话立即到期

Biz*_*rro 7 php session clock

我开发了这个PHP Web应用程序,现在运行了几个月.突然,其中一个用户抱怨他能够登录,但是一旦他点击任何按钮就会终止会话!同样的问题发生在不同的浏览器上.

经过一些测试后,我意识到每次用户点击任何按钮时都会创建一个全新的会话ID,这可能是因为原始会话已过期.

无论出于何种原因,我都瞥了一眼用户的电脑时钟......惊喜!他的时钟在未来3个月!我不知道这件事是否与失败有任何关系,但我确实修好了时钟.它仍然没有用.我删除了所有的cookie.依然没有.所以我重新启动了浏览器 - 然后它再次开始工作!

我得到的关于这个问题的最接近的信息是Shimon Amit对这个问题的回答.好,现在我知道时钟"错误配置"是原因.问题是......我无法控制每个客户的计算机时钟.他们中的一些人将来可能会设置他们的计算机时钟.

我的问题:这有什么解决方案吗?任何诡计?我不希望客户面对这样的错误,因为他们可能会发现它"跛脚"并打破他们对应用程序的信任,即使这不是我的错(在某种意义上).

Ray*_*Ray 5

会话cookie(如所有cookie)在客户端浏览器过期时被控制和删除.即使您设置了一个远期过期日期(您可能不想做任何事情),所有客户需要做的就是将时钟向前移动,它将会过期.


Jos*_*ser 2

您可以将会话超时延长到以后的日期。也许您可以使用不会过期的 cookie(会话与客户端的 cookie 相关),否则,您的客户端浏览器只是执行其设计的操作。

编辑:Javascript选项

这完全是一个 hack,但是您可以使用 javascript 获取客户端计算机上的当前时间并将其发送回服务器,然后将会话 cookie 的超时调整为三个月后过期。请参阅http://www.w3schools.com/jsref/jsref_gettime.asp

检索到客户端时间后,您可以使用 session_cache_expire() 重置会话过期时间。 http://www.php.net/manual/en/function.session-cache-expire.php

编辑:100% 服务器端选项

我想到的另一个选择是设置一个没有过期时间的会话 cookie,但跟踪 cookie 在服务器上设置的时间,比如在 MySQL 表中。您还需要跟踪最后的活动。每当登录用户发出请求时,您都可以检查他们的会话的开始时间和最后的活动。如果当前时间大于您可接受的超时时间,则销毁会话服务器端并将它们带回登录页面。如果会话仍然正常,则更新与该用户关联的最后一个活动,以便您可以对下一个请求进行比较。无需客户端代码。