【发布时间】:2018-10-17 12:31:07
【问题描述】:
我在我的 phorum 服务器中遇到了一个奇怪的错误 - 似乎是随机的,一些用户将相互交换,并发现他们彼此完全登录,可以完全访问彼此的帐户。我自己曾经遇到过这个错误,但无法重新创建它。
Phorum 被配置为通过 cookie 跟踪会话,会话哈希也存储在用户数据库中。我已经确认数据库完好无损,并且没有发生会话 ID 冲突。
您可以查看 phorum 的身份验证和会话管理的源代码here,它相当简单。会话只能通过登录或现有 cookie 创建,所以我的工作理论(在与 phorum 开发人员交谈后)是服务器上存在某种缓存问题。有一个影响 ASP 的已知缓存问题(参见 here 或 here 示例),但我的服务器是运行 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