防止PHP中的会话冲突

时间:2009-06-22 15:07:17

标签: php session

最近,我偶然发现了一个有趣的错误,即应用程序中不存在的用户会在我们的本地定制票务系统中显示条目。经过一番探讨,我意识到在同一台服务器上运行的这个和另一个PHP应用程序都使用$ _SESSION ['user']进行身份验证。当有人使用一个系统然后打开另一个系统时,他会从第一个应用程序“自动”以用户身份登录。

在强制性facepalm之后,我更改了其中一个系统中的会话变量名称以停止此操作。但是,我需要对会话处理类进行永久的,零维护更改,以避免在将来的项目中使用此更改。我认为这可以通过使用唯一值(例如脚本路径)将应用程序的变量放在$ _SESSION中不会被其他应用程序使用的位置来完成。

有更好的方法吗?

编辑:这是在Linux上。这两个应用程序都在同一个网站上。

3 个答案:

答案 0 :(得分:4)

您可以通过确保限制性地设置Cookie的域和路径来确保会话Cookie特定于应用程序,例如,对于http://www.example.com/apppath的申请,您可以执行以下操作:

<?php

$currentParams = session_get_cookie_params();

session_set_cookie_params($currentParams['lifetime'], '/apppath/', 'www.example.com', $currentParams['secure'], $currentParams['httponly']);

session_start();

这将使其他会话设置保持不变。

路径可能是重要的路径,默认情况下,PHP会为请求该站点的域发出cookie(我认为),因此您可能实际上将domain参数保留为默认值。

答案 1 :(得分:1)

设置cookie路径,以便每个应用程序仅存储对其自己的路径有效的会话cookie。

您可以使用session_set_cookie_params电话执行此操作。

答案 2 :(得分:0)

说到共享主机,最好将会话ID存储在数据库中,而不是将其存储在服务器上,有很多材料可用于如何在数据库中存储会话ID,更多的是定期更改已登录的用户会话ID还可以提高安全性并减少冲突。