php - 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
解决方案
@Sammitch 是正确的 - phorum 没有在我的大多数页面的标题中设置缓存控制。这导致我的托管服务自己的缓存系统缓存包含会话 cookie 的响应。
我通过更改我的 .htaccess 文件来解决这个问题,如下所述:https ://stackoverflow.com/a/7664157/1411376
这似乎适用于我的服务器配置,因为 php 代码(phorum)没有设置缓存控制的代码(ajax 请求除外)。