编程语言
首页 > 编程语言> > PHP-Chrome使用相同的ID创建重复的会话

PHP-Chrome使用相同的ID创建重复的会话

作者:互联网

今天,我在修改会话库时遇到了一个问题,这可能是我第一次在后端脚本上看到特定于浏览器的问题.我希望有人能有所启发.

会话库的工作原理基本上是:实例化后,它将在客户端计算机上检查名为“ id”(以单数结果形式)的cookie.如果找到cookie,则脚本将根据会话表中的条目检查该ID以及该用户代理字符串的哈希副本.如果找到匹配的条目,脚本将继续会话.如果未找到名为“ id”的cookie,或者会话表中不存在匹配的条目,则脚本将创建两者.我认为是相当标准的.

现在这是一个奇怪的部分:在Firefox中,一切都按预期运行.只要没有闲置24小时,用户就会获得一个会话,他将在连接后始终恢复该会话.但是,当我在Chrome中访问该页面时,即使它看起来相同并且似乎以相同的顺序执行查询,但我在会话表中看到了两个条目.这些会话共享一个代理字符串,但是ID不同,并且时间戳日志指示在为用户创建虚连接后不久(不到一秒钟)创建了虚连接.

出于调试目的,我一直在执行查询时将查询打印到屏幕上,这是当Chrome应该打开一个会话而以某种方式打开两个会话时所看到的示例:

// Attempting to resume a session
SELECT id FROM sessions WHERE id = '4fd24a5cd8df12.62439982' AND agent = '9bcd5c6aac911f8bcd938a9563bc4eca'

// No result, so it creates a new one
INSERT INTO sessions (id, agent, start, last) VALUES ('4fd24ef0347f26.72354606', '9bcd5c6aac911f8bcd938a9563bc4eca', '1339182832', '1339182832')

// Clear old sessions
DELETE FROM sessions WHERE last < 1339096432

以下是我在数据库中看到的内容:

id, agent, start, last
4fd24ef0347f26.72354606, 9bcd5c6aac911f8bcd938a9563bc4eca, 1339182832, 1339182832
4fd24ef0857f94.72251285, 9bcd5c6aac911f8bcd938a9563bc4eca, 1339182833, 1339182833

我是否缺少明显的东西?我唯一能想到的是Chrome可能会在后台创建一个隐藏的会话,可能会抓取页面.如果是这种情况,那么当我开始将活动会话与用户表中的条目相关联时,可能会成为问题.我一直在寻找脚本中可能存在的错误,但是到目前为止我还没有发现任何东西,并且一切都可以在Firefox中正常运行.

解决方法:

我以前曾经遇到过这个问题,并且同样感到困惑.从几个月前开始,Chrome已启用预取功能.因此,为了加快用户的感知速度,它会爬网页面上的大多数链接,并提前部分进行检索和渲染.非常适合最终用户,因为如果您使用宽带,则可以真正减少页面更改时间.

对于我们的Web开发人员而言,不幸的是,它会导致上述混乱.例如,当Chrome用户访问网站但尚未分配Cookie或会话,但浏览器已预提取多个页面并分配了多个会话时,就会发生这种情况.

因此,假设有人访问了指向您的PHP脚本不同区域的链接的页面,并且该脚本旨在将Cookie分配给所有访问者…如果Chrome浏览器同时获取或访问了其中的两个页面,则PHP最终会分配不同的会话,因为Chrome中的另一个线程基本上会在完成其他任务之前需要一个新的会话/ cookie.

我知道有两种解决方案:一种是Google’s JavaScript API for handling prerendering,我发现它不是特别好.另一种方法是从PHP分发会话和cookie时执行更严格的检查.不要将会话分配给来宾用户,也不要添加一些其他检查(IP,主机名等).

希望能有所帮助.

标签:cookies,google-chrome,php
来源: https://codeday.me/bug/20191201/2079238.html