【问题标题】:Will PHP code of an app always have read/delete access to session files on the same server?应用程序的 PHP 代码是否始终可以读取/删除同一服务器上的会话文件?
【发布时间】:2026-01-28 08:00:01
【问题描述】:

为了我的 Joomla! 3.8+ 扩展我需要能够查找和删除(取消链接)将存储在 session_save_path 中的 PHP 会话文件(名为 'sess_' + 会话 ID),例如/tmp。我知道存储会话文件的是 PHP,而不是 Joomla! (Joomla!会话处理程序设置为“PHP”) 我的问题:将通过使用 Joomla 创建的 PHP 会话文件!我的扩展程序的 PHP 代码始终可以读/写网站,该代码是同一个 Joomla 的一部分!安装?

补充:我后来意识到,我在我的问题中省略了“总是”这个词,现在我已经添加了。

补充:更深入地解释我想要实现的目标。 正如我所说,我有一个 Joomla!网站,用户可以登录的地方。 该问题仅适用于 Joomla!配置为会话处理程序设置为“PHP”(而不是“数据库”)。当 Session Handler 为 'database' 时,没有问题。

基本上,我想实现以下目标(将 Joomla! 会话处理程序设置为“PHP”):

1> 用户打开浏览器 A 并登录网站和 Joomla! 在数据库中记录相关的会话 ID 和用户 ID。

2>同一个用户打开不同的浏览器B(​​可能在不同的IP) 并想登录同一个网站。

3> 因为用户已经通过浏览器A登录了网站, 不允许他/她再次登录,并会收到一个 可点击的链接将破坏他的所有其他会话,包括 一个使用浏览器 A(我们已经记录了所有其他的会话 ID 会话)。

仅在第 3 步中的 session_destroy() 只是部分起到了作用,因为被破坏的会话细节会在 Joomla 上重新出现一段时间后!后端,也在 Joomla!会话表。虽然这不会干扰 Joomla!前端,它不干净,我想避免它,以防万一。 到目前为止,最好的解决方案是我是否可以删除 PHP 会话文件(例如在 dir /tmp 中并命名为“sess_....”)。我已经对此进行了测试,并且效果很好。但是...它依赖于始终具有对 PHP 会话文件的删除访问权限(使用 session_save_path() 和 unlink($session_file_path)),这是我发布的问题的基础。 我发现并非总是可以删除 PHP 会话文件;这取决于提供者的 PHP 配置。由于它是我正在开发的商业应用程序,因此该过程必须适用于所有配置,即包括那些不允许删除访问会话文件的配置。

我会继续寻找解决方案,找到后会在此处发布。

【问题讨论】:

  • 我不知道 Joomla,但是如果服务器配置为使用数据库或缓存来存储会话数据怎么办?
  • 只是好奇,您要解决什么问题需要直接删除 PHP 会话?也许有不同的解决方案?
  • @RyanVincent 我已经编辑了我的帖子以包含您问题的答案

标签: php session destroy read-write


【解决方案1】:

您想要的通常是可能的,但它会带来安全风险(试想一下:一个用户可以在知道会话文件属于谁之前读取会话文件,那些其他用户),因此具有安全意识的 ISP 将努力防止这种情况发生。

因此,即使您设法做到了这一点,也无法保证如果 ISP 将来加强其安全性,您的代码不会崩溃。这会带来一些维护上的不安。

更好的解决方案是有一个无效会话ID的辅助表。

然后你编写一个用户插件来挂钩onUserAuthorizationonUserLogout 事件。你也需要onAfterInitialise

这个钩子会在初始化时检查当前会话 ID 是否已经失效;如果是,则触发立即注销。否则,更新其时间戳。

在用户注销时,当前会话 id 将从表中删除并且会话被销毁。

在重新登录时,会发出有关其他会话正在打开的警告:如果登录成功,同一用户的所有其他会话将被标记为无效。

作为一项维护任务,所有时间戳早于最大会话生命周期的条目都可以安全地删除。

【讨论】:

  • @LSemi 感谢您的全面回答。是的,我注意到许多 ISP 允许删除 PHP 会话文件,但不是全部。对于这个“不是全部”部分,我不得不想出一个替代方案,我最终完全按照你的建议做了。您也提出这种方法的事实告诉我,我做对了。再次感谢和问候。
  • @RobNL 您现在应该接受一个答案,或者(如果您认为这真的不太可能对其他人有用 - 我不同意,但这是您的电话)也许删除问题。
【解决方案2】:

这取决于服务器设置。

  1. 查找 PHP 正在使用的用户:How to check what user php is running as?

  2. 检查该用户对存储会话的文件夹的权限:Unix: How to check permissions of a specific directory?

  3. 根据需要更改权限:https://serverfault.com/questions/105535/how-can-i-set-full-premissions-to-a-user-in-a-specified-dir

【讨论】:

    【解决方案3】:

    谢谢@Nigel 和@AgeDeO

    通过反复试验,我发现答案是否定的,并非总是如此。 通过使用一些商业 ISP 执行代码,我遇到了一个 ISP,该 ISP 不允许我在 PHP 会话文件位于其默认位置时删除它。位置是 /var/lib/php5。

    【讨论】:

      最近更新 更多