我开发了这个PHP Web应用程序,现在运行了几个月。突然,其中一个用户抱怨他能够登录,但是一旦他点击任何按钮就会终止会话!同样的问题发生在不同的浏览器上。
经过一些测试后,我意识到每次用户点击任何按钮时都会创建一个全新的会话ID,可能是因为原始会话已过期。
无论出于何种原因,我都瞥了一眼用户的电脑时钟......惊喜!他的时钟在未来3个月!我不知道这件事是否与失败有任何关系,但我确实修好了时钟。它仍然没有用。我删除了所有的cookie。依然没有。所以我重新启动了浏览器 - 然后它又开始工作了!
我得到的关于这个问题的最接近的信息是Shimon Amit对this question的回答。好,现在我知道时钟“错误配置”是原因。问题是......我无法控制每个客户的计算机时钟。他们中的一些人将来可能会设置他们的计算机时钟。
我的问题:有什么解决方法吗?任何诡计?我不希望客户面对这样的错误,因为他们可能会发现它“跛脚”并打破他们对应用程序的信任,即使这不是我的错(在某种意义上)。
答案 0 :(得分:5)
会话cookie(与所有cookie一样)在客户端浏览器过期时被控制和删除。即使您设置了一个远期过期日期(您可能不想做任何事情),所有客户需要做的就是将时钟向前移动,它将会过期。
答案 1 :(得分:2)
您可以将会话超时延长到以后的日期。也许您可以使用未过期的cookie(会话与客户端的cookie相关)否则,您的客户端的浏览器就是按照它的设计来做的。
编辑:Javascript选项
这是一个完全黑客攻击,但您可以使用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表中。您还需要跟踪上一个活动。每当登录用户发出请求时,您都可以检查其会话的开始时间和上次活动。如果当前时间大于其中任何一个的可接受超时,则销毁会话服务器端并将其带回登录页面。如果会话仍然正常,则更新与该用户关联的最后一个活动,以便您可以在下一个请求中进行比较。没有必要的客户端代码。
答案 2 :(得分:2)
我完全同意@ MarcB的评论,即你不能对用户机器严重配置错误承担责任。如果你真的想在这方面有所作为,我会建议使用PHP输出一小段javascript,其中包括服务器上的时间。该片段会将该时间与客户端计算机上的时间进行比较,如果时间与服务器的时间相差超过X,则会发出警报。 [比方说,24小时左右]
答案 3 :(得分:1)
任何技巧?
使用会话cookie。不是PHP会话意义上的会话,而是浏览器会话。存储Session cookies直到用户关闭浏览器。它们不受用户设置计算机的任何时钟的影响。它们将持续到浏览器关闭。
这通常适用于与PHP会话相关的cookie。
对于PHP,您需要确保在会话开始之前将会话cookie参数 lifetime 配置为0
。这可以是ini设置session.cookie_lifetime
,也可以是调用session_set_cookie_params
函数。
有关cookie参数的更详细说明,请参阅setcookie
函数的文档。
第二部分技巧是将会话开始时间戳和最后一个活动时间戳放入PHP $_SESSION
。这些都是基于服务器的所以总是有相同的基础。
检查它们,例如如果会话太旧,很久以前的最后一次活动等,则销毁会话并强制用户再次登录。
您甚至可以使用该技巧的第二部分将其与未来10年到期的Cookie相结合(好吧,浏览器可能喜欢,也许您只想要三个个月)。
答案 4 :(得分:-1)
尝试禁用会话超时或至少将其设置为将来。这应该可以解决问题。