浏览器关闭时使自定义PHP会话失效

时间:2011-11-24 01:11:02

标签: php session server-side

我正在使用MySql构建一个自定义PHP Session处理程序,而且我一直在努力解决问题。在Stack Overflow中搜索完整(或者不是很多,取决于个人意见)之后,我找不到我的问题的答案:大多数只是回答如何在客户端使会话到期,但这个问题集中于服务器端。

问题如下:我将会话数据存储在SQL数据库中,并将会话的id作为cookie发送(基本会话处理); 如果用户选择不记住(也就是让我登录/记住我),cookie将在浏览器关闭时失效,但由于显而易见的原因,它不会在数据库上过期(这不是故意的,但是很难判断浏览器何时从服务器端关闭);此外, if 选择记住的用户,cookie不应该过期,并且用户应该在他再次启动浏览器时自动登录。

我想要做的是在浏览器关闭时使数据库上的会话失效(如果用户没有选择记住我),并且保持会话处于活动状态如果用户选择记住我,则两端都结束,但如果他再次登录(并取消设置/删除前一个会话),则为用户分配一个新会话。

所有为了安全起见,我绝对想要废除不会再次使用的会话;例如,当用户关闭浏览器时,cookie将被删除,并且相应的用户将不再合法地访问会话,因此应将其删除。

我目前的想法是使用双重会话:拥有两个带有两个不同ID和cookie的cookie,其中一个cookie在浏览器关闭时会过期,一个将保留,后者将用于引用主要一,删除它,生成一个新用户并登录用户(如果用户选择记住)。双会话不一定需要两个数据库,因为它们可以存储在具有不同字段的同一个表中。

我的主要目标是保持数据库清洁和系统安全。 您如何在服务器端管理会话过期?

2 个答案:

答案 0 :(得分:4)

首先,当用户关闭浏览器时,无法确定。使用两个cookie无济于事,因为用户可以控制浏览器,并且可以选择保留您认为在浏览器关闭时消失的cookie并删除您要检查删除的持久性跟踪cookie原来的会议。这意味着您的解决方案可能永远不会使服务器上的会话失效。

更好的解决方案是将到期日期/时间(比如说从现在起30分钟)写入数据库会话记录。每次用户尝试访问会话时,都要检查过期日期/时间是否已过。如果过期已过,请删除会话并拒绝用户访问。如果未到期,请让用户进入并更新到期日期/时间(从现在起30分钟,就像您创建会话时一样)。这意味着如果用户在30分钟内未访问您的应用程序,则表示您假定用户已关闭浏览器并且其会话已到期。只要用户每30分钟至少执行一次操作,会话将在服务器端保持活动状态。

要清理已过期且用户未回来的会话(或者可能已清除其Cookie或某些内容),您可以拥有一个后台进程,该进程可能每天运行一次,以删除过期的会话。

您可以使用相同的策略进行长期记忆型会话,只需使用更长的过期日期/时间(可能距当前日期/时间14天)。

我个人将会话存储在Redis哈希中(Redis是一个NoSQL内存数据库),它允许我为哈希设置一个到期时间,Redis会在哈希到期时自动删除它,这使我无需删除后台进程旧会议。

答案 1 :(得分:0)

简单来说,如果用户没有选中“记住我”框,则可以使用Session Cookie,如果用户没有,则可以使用Permanent Cookie