php - Chrome 正在创建具有相同 ID 的重复 session

标签 php google-chrome cookies

我今天在修改我的 session 库时遇到了一个问题,这可能是我第一次在后端脚本上看到特定于浏览器的问题。我希望有人能给出一些启示。

基本上, session 库的工作方式是:在实例化时,它会在客户端计算机上检查名为“id”的 cookie(以 uniqid 结果的形式)。如果找到 cookie,脚本会根据 session 表中的条目检查该 cookie 和用户代理字符串的散列副本。如果找到匹配条目,脚本将恢复 session 。如果未找到名为“id”的 cookie,或者 session 表中不存在匹配的条目,则脚本会同时创建两者。我认为相当标准。

现在这是奇怪的部分:在 Firefox 中,一切都按预期进行。用户获得一个 session ,只要未超过 24 小时不活动,他将始终在连接后恢复。但是当我在 Chrome 中访问该页面时,即使它看起来相同并且似乎以相同的顺序执行查询,我也会在 session 表中看到两个条目。这些 session 共享一个代理字符串,但 ID 不同,时间戳日志表明在为用户创建 session 后不久(一秒内)创建了 ghost session 。

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

// 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 可能会在后台创建一个隐藏 session ,可能是为了抓取页面。如果是这样的话,当我开始将事件 session 与用户表中的条目相关联时,它可能会在以后成为问题。我一直在寻找我的脚本中可能存在的错误,但到目前为止我还没有发现任何错误,并且在 Firefox 中一切都按预期工作。

最佳答案

我以前遇到过这个,同样感到困惑。从几个月前开始,Chrome 就启用了预取。因此,为了加快用户的感知速度,它会抓取页面上的大部分链接,并提前部分检索和呈现它们。非常适合最终用户,因为如果您使用宽带,它确实可以减少页面更改时间。

不幸的是,对于我们的 Web 开发人员来说,它会导致像上面那样的困惑。例如,当 Chrome 用户访问网站时尚未分配 cookie 或 session ,但浏览器已预取多个页面并分配了多个 session 时,就会发生这种情况。

假设有人访问了一个页面,该页面包含指向您的 PHP 脚本不同区域的链接,并且该脚本旨在为所有访问者分配一个 cookie...如果 Chrome 同时或接近获取其中两个页面,PHP 将最终分配不同的 session ,因为 Chrome 中的另一个线程基本上会在另一个分配完成之前需要一个新的 session /cookie。

我知道有两种解决方案:一种是 Google's JavaScript API for handling prerendering ,我还没有发现它特别好。另一种方法是在从 PHP 分发 session 和 cookie 时执行更严格的检查。要么不要将 session 分配给 guest 用户,要么添加一些额外的检查(IP、主机名等)。

希望对您有所帮助。

关于php - Chrome 正在创建具有相同 ID 的重复 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10954917/

相关文章:

php - 如果另一个表中不存在某个值,如何插入行?

php - 让 PHP 与同一服务器上的进程通信的推荐方法

php - 如何在新标签/窗口中打开每个 Wordpress 帖子?

javascript - 使用 javascript 设置的 Cookie,无法被 PHP 识别(相同的域和路径)

php - 哪种加密算法最适合加密 cookie?

php - 解析错误: syntax error, unexpected '{' in PHP? [closed]

performance - 如何读取 Chrome DevTools 中的网络选项卡 - 加载时间

css - 与 Firefox 相比,谷歌浏览器显示不同的结果

css - 具有不透明度的内联 block ul 导致结束切断

node.js - 我无法在 Nodejs (Express) 中将 cookie 的 SameSite 属性设置为 None