【问题标题】:PHP cookie-bases session swapping in phorumphorum 中基于 PHP cookie 的会话交换
【发布时间】:2018-10-17 12:31:07
【问题描述】:

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

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

您可以查看 phorum 的身份验证和会话管理的源代码here,它相当简单。会话只能通过登录或现有 cookie 创建,所以我的工作理论(在与 phorum 开发人员交谈后)是服务器上存在某种缓存问题。有一个影响 ASP 的已知缓存问题(参见 herehere 示例),但我的服务器是运行 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 远程地址:x.x.x.x:443

推荐人政策:no-referrer-when-downgrade

响应标头

内容编码: 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 变化:Accept-Encoding via:e3s

请求标头

:authority: www.example.com

:方法: GET

:路径: /forum/list.php?11

:方案: https

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

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

缓存控制: max-age=0

cookie: 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(来自内存缓存)

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

响应标头

年龄: 734

缓存控制:必须重新验证

内容编码: gzip

内容长度: 2862

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

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

到期: 2018 年 5 月 8 日星期二 02:29:37 GMT

编译指示:缓存

服务器: Apache

状态: 200

变化:接受编码

通过: e2s

【问题讨论】:

  • (我知道 ASP 和 PHP 是不同的 - 我想知道 PHP 是否可以像 ASP 那样不正确地缓存响应。)
  • PHP 不缓存,但链中的其他东西可能会。例如:您的 http 服务器或运行应用程序的边缘缓存/CDN。如果您的应用程序为包含特权信息的页面设置缓存标头,这些信息对每个用户没有不同,那么正确配置的中间缓存可能会导致您描述的确切情况。
  • @Sammitch 谢谢 - 我在我的问题中添加了一些示例请求和响应标头。 “cache-control: max-age=0”是否有可能导致并发请求被缓存?对于更明显的问题,我将继续检查论坛其他部分的响应。
  • request 中的缓存控制标头无关紧要,因为它完全由用户/浏览器控制。您的 service 需要知道 至少 什么 not 缓存,并为仅相关的资源响应设置相关的 Cache-Control: private 标头对于单个用户,您没有当前的情况,这本质上是准备被利用的缓存错误。 developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
  • @Sammitch 好吧-我明白了。我已将我的 .htaccess 文件设置为为我的 php 文件设置 cache-control: private, no-cache。等待确认这个工作,但我怀疑你已经确定了。我想private, must-revalidate 也足够了?

标签: php session cookies session-cookies


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2012-04-15
    • 2014-07-08
    • 2011-04-11
    • 2011-08-26
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多