首页 > 解决方案 > phorum 中基于 PHP cookie 的会话交换

问题描述

我在我的 phorum 服务器中遇到了一个奇怪的错误 - 似乎是随机的,一些用户将相互交换,并发现他们彼此完全登录,可以完全访问彼此的帐户。我自己曾经经历过这个错误,但无法重新创建它。

Phorum 被配置为通过 cookie 跟踪会话,会话哈希也存储在用户数据库中。我已经确认数据库完好无损,并且没有发生会话 ID 冲突。

您可以在此处查看 phorum 的身份验证和会话管理的源代码,它相当简单。会话只能通过登录或现有 cookie 创建,所以我的工作理论(在与 phorum 开发人员交谈后)是服务器上存在某种缓存问题。有一个影响 ASP 的已知缓存问题(有关示例,请参见此处此处),但我的服务器是运行 Apache 2.4、MySQL(技术上是 MariaDB 10.1 + InnoDB)和 PHP 5.6 的 Linux 服务器。有谁知道这可能是如何发生的?我已经为此工作了一个多星期,除了确认 phorum 会话代码中没有错误之外,几乎没有取得什么进展。

我必须继续的唯一线索是会话交换在我的托管服务关闭(并恢复)他们的文件服务器的同一天开始。然而,他们说他们不明白这怎么可能是负责任的。

编辑#1:我正在添加一些请求和响应标头。

这是获取论坛列表的初始 GET 响应。 一般的

请求网址: https ://www.example.com/forum/list.php?11请求

方法: GET 状态码:200 远程地址:xxxx:443

推荐人政策:降级时无推荐人

响应标头

内容编码: gzip 内容类型:text/html;

charset=UTF-8 日期:星期一,2018 年 5 月 7 日 20:23:08 GMT 服务器:Apache

设置cookie: phorum_session_v5=35%3A412b7c329cc8741de88532342df9;expires=星期二,2018 年 5 月 8 日 20:23:08 GMT;最大年龄=86400;路径=/

状态: 200 变化:接受编码通过:e3s

请求标头

:authority: www.example.com

:方法:获取

:path: /forum/list.php?11

:方案: https

接受: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng, / ;q=0.8

接受编码: gzip,放气,br 接受语言:en-US,en;q=0.9

缓存控制: max-age=0

饼干: phorum_session_v5=35%3A412b7c329cc8741de88532342df9;

推荐人: https ://www.example.com/forum/addon.php?11,module=user_list

升级不安全请求:1 个用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/66.0.3359.139 Safari/537.36

这是一个后续的 Ajax 调用:

一般的

请求网址: https ://www.example.com/forum/ajax.php?client

请求方法:GET 状态码:200(来自内存缓存)

远程地址:xxxx:443 推荐人策略:no-referrer-when-downgrade

响应标头

年龄: 734

缓存控制:必须重新验证

内容编码: gzip

内容长度: 2862

内容类型:文本/javascript;charset=UTF-8

日期: 2018 年 5 月 7 日星期一 18:29:37 GMT

到期:格林威治标准时间 2018 年 5 月 8 日星期二 02:29:37

杂注:缓存

服务器:阿帕奇

状态: 200

变化:接受编码

通过: e2s

标签: phpsessioncookiessession-cookies

解决方案


@Sammitch 是正确的 - phorum 没有在我的大多数页面的标题中设置缓存控制。这导致我的托管服务自己的缓存系统缓存包含会话 cookie 的响应。

我通过更改我的 .htaccess 文件来解决这个问题,如下所述:https ://stackoverflow.com/a/7664157/1411376

这似乎适用于我的服务器配置,因为 php 代码(phorum)没有设置缓存控制的代码(ajax 请求除外)。


推荐阅读