由一个项目创建的会话也可以由 PHP 中的其他项目访问


Session created by one project is also accessible by other project in PHP

在我的一个项目中,在本地主机上创建了一个用于用户登录的会话。它存储在$_SESSION['uname']。我的其他一些项目也使用相同的会话名称变量。问题是当我已经登录到我的第一个项目管理区域然后我转到我的另一个项目管理区域时,它不会要求我输入登录窗口的凭据;相反,它直接将我带到管理面板。我知道这是由于在我的各种项目中使用相同的$_SESSION['uname']而发生的。所以我想知道尽管我已经登录了我的第一个项目,我们如何强制其他项目显示登录窗口?

也可能我的其他项目有一些不同的登录凭据,但如果我已经登录到我的第一个项目,我永远不会为我提供登录屏幕。

我还在想,专业网站如何保持其会话名称的唯一性,以便其他人永远无法使用它?就我而言,会话名称可以在任何地方访问。

看起来您正在为本地的每个项目使用 localhost。

  1. 为每个项目创建单独的虚拟主机,然后会话对于每个项目都是唯一的 - 因为cookie的域是不同的。
  2. 如果你想保留localhost(我不推荐),你应该考虑每个项目会话的命名空间,比如$_SESSION['project1']['uname']

这主要是因为您为所有项目使用 localhost 或同一主机。尝试为项目设置虚拟主机。

请参阅设置虚拟主机的链接

https://httpd.apache.org/docs/2.2/vhosts/examples.html

检查 php.ini session.cookie_domain 指令,以指定在会话 cookie 中设置的域。

或者您可以检查session_set_cookie_params功能。它具有$domain参数来设置可以访问会话cookie的域。

例如,要将会话 cookie 设置为仅对mywebsite.com可见:

<?php
session_set_cookie_params(3600, '/', 'mywebsite.com');
session_start();

您可以在注销屏幕中使用session_unset()然后$_SESSION['uname']将为空

否则,对 uname 使用特殊名称(可能是 ['uname'][0])

您也可以将 md5 用于 uname $_SESSION[md5("project 1 uname")];$_SESSION[md5("project 1 namespace")]["uname"];

希望我有帮助。

相关文章: