如何使用会话正确分离环境?

时间:2013-06-28 23:29:27

标签: php session

我的软件中出现了这种情况,这可能会给我带来很多麻烦。我会尽力解释一下。

实际上我有3个环境,所有3个环境使用相同的寄存器,登录和恢复系统。但是它们中的每一个都是正确分开的,假设结构是:

  • 管理/
  • 商店/
  • 供应商/

上面的结构在类中包含Register,Log In和Recovery方法,但代码是相同的。我知道它会一起制作并创建一些识别码来分隔它们,但软件并没有计划像这样增长,现在我们遇到了一种情况。 ;(

当我登录管理员帐户时,我首先遇到了问题,并尝试在没有任何会话的情况下访问商店/环境(帐户)(但当然使用的会话是管理员帐户)。我获得了访问权限,如果一个供应商知道该问题或商店的客户知道这一点,则不安全。

我该怎么做才能防止这类问题?重写代码?或者是否有一些解决方法可以写入我的会话代码?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用session_name()来定义用于存储会话ID的Cookie名称,这样您就可以命名并分隔同一主机下的不同环境。在致电session_start()之前使用它。

例如,管理员区域中的每个session_start()来电都应该在:

之前
session_name("ADMINSESSID");
session_start();

您对商店和供应商做了类似的事情。

虽然它可以分隔$_SESSION个环境,但我并不完全确定它的安全性方面(例如编辑Cookie以使用供应商会话ID作为管理员会话ID)。也许您还应该在每个$_SESSION标记它所属的环境。

登录时间:

// if user authenticated successfully to that environemnt
$_SESSION['environment'] = session_name();

同一网站区域的其他任何地方:

if ($_SESSION['environment'] != session_name())
    die('Access violation.');