应用程序的PHP代码是否将始终对同一服务器上的会话文件具有读取/删除访问权限?

时间:2018-11-01 15:02:01

标签: php session destroy read-write

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

添加:后来我意识到,我在问题中省略了“始终”一词,现在我已经添加了。

添加:关于我要实现的目标的更深入的解释。 正如我说的,我有一个Joomla!用户可以登录的站点。 该问题仅适用于Joomla!将会话处理程序设置为“ PHP”(而不是“数据库”)进行配置。当会话处理程序为“数据库”时,没有问题。

从根本上讲,我想实现以下目标(将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配置。由于这是我正在开发的商业应用程序,因此该过程必须适用于所有配置,即包括那些不允许删除对会话文件的访问权限的配置。

我将继续搜索解决方案,并在找到它后将其发布在这里。

3 个答案:

答案 0 :(得分:1)

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

因此,即使您设法做到这一点,也无法保证ISP在将来加强其安全性时不会破坏您的代码。这使维护变得有些不安。

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

然后,您编写一个钩住onUserAuthorizationonUserLogout事件的用户插件。您还将需要onAfterInitialise

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

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

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

作为维护任务,可以安全清除所有时间戳大于最大会话生存期的条目。

答案 1 :(得分:0)

这取决于服务器设置。

  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

答案 2 :(得分:0)

谢谢@Nigel和@AgeDeO

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