【问题标题】:Preventing session conflicts in PHP防止 PHP 中的会话冲突
【发布时间】:2009-06-22 15:07:16
【问题描述】:

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

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

有没有更好的办法?

编辑:这是在 linux 上。并且这两个应用都在同一个网站上。

【问题讨论】:

  • PHP 在 Windows 或 Linux 上?两个应用都在同一个网站上吗?

标签: php session


【解决方案1】:

您可以确保 Session 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(我认为),因此您实际上可以将域参数保留为默认值。

【讨论】:

    【解决方案2】:

    设置 cookie 路径,以便每个应用只存储对其自身路径有效的会话 cookie。

    您可以通过session_set_cookie_params 调用来做到这一点。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 2019-09-12
        • 1970-01-01
        相关资源
        最近更新 更多