浏览器关闭时过期的自定义PHP会话
作者:互联网
我正在使用MySql构建自定义的PHP会话处理程序,并且一直在努力解决问题.在Stack Overflow中进行了全面(或不太多,取决于个人意见)搜索后,我找不到我的问题的答案:大多数只是回答如何在客户端终止会话,但此问题的重点是服务器端.
问题如下:我将会话数据存储在SQL数据库上,并将该会话的ID作为Cookie发送(基本会话处理);如果用户选择不被记住(也请保持我的登录状态/记住我的信息),则cookie应该在浏览器关闭时过期,但是出于明显的原因,它不会在数据库中过期(这不是故意的,但这是很难判断浏览器何时从服务器端关闭);此外,如果选择记住该用户,则该cookie不应过期,并且该用户在再次启动浏览器时应自动登录.
我想做的是在关闭浏览器时使数据库上的会话过期(如果用户未选择记住我),并且如果用户选择记住我,但分配用户,则使会话在两端都保持活动状态如果他再次登录(并取消设置/删除前一个会话),则创建一个新会话.
为了安全起见,我绝对想取消将不再使用的会话.例如,当用户关闭浏览器时,该cookie被删除,并且相应的用户将不会再合法地访问该会话,因此应将其删除.
我当前的想法是使用双重会话:拥有两个具有两个不同ID和cookie的cookie,其中一个cookie将在关闭浏览器时到期,而一个cookie将保留,而后者将用于引用主要的cookie,即delete并生成一个新用户,然后将用户重新登录到该新用户(如果选择了要记住的用户).双重会话不一定需要两个数据库,因为它们可以存储在同一表中的不同字段中.
我的主要重点是保持数据库干净和系统安全.您将如何在服务器端管理会话过期?
解决方法:
首先,无法确定用户何时关闭浏览器.使用两个cookie并没有帮助,因为用户可以控制浏览器,并且可以选择保留您认为在浏览器关闭时将消失的cookie,并删除要检查的持久跟踪cookie以删除原始会话.这意味着您的解决方案可能永远不会使服务器上的会话过期.
更好的解决方案是将到期日期/时间(例如,从现在开始30分钟)写入数据库会话记录.每次用户尝试访问会话时,请检查是否已经过了到期日期/时间.如果到期,请删除会话并拒绝用户访问.如果没有过期,请让用户输入并更新过期日期/时间(从现在开始30分钟,就像创建会话时一样).这意味着,如果用户在30分钟内没有访问您的应用程序,则假定您已关闭浏览器并正在终止其会话.只要用户至少每30分钟执行一次操作,会话就将在服务器端保持活动状态.
要清理已过期且用户尚未回来的会话(或清除其cookie或其他内容),您可以让后台进程每天运行一次,以删除过期的会话.
您可以通过使用更长的到期日期/时间(可能距离当前日期/时间14天)来对长期的“记住我”类型会话使用相同的策略.
我个人将会话存储在Redis哈希(Redis是NoSQL内存数据库)中,这使我可以设置哈希值的到期时间,并且当哈希值过期时,Redis会自动将其删除,从而避免了后台删除旧会话的过程.
标签:server-side,session,php 来源: https://codeday.me/bug/20191102/1987777.html