【问题标题】:How do I properly separate environment using sessions?如何使用会话正确分离环境?
【发布时间】:2013-06-28 23:29:27
【问题描述】:

我在我的软件中遇到了一个问题,这会让我很头疼。我会尽力解释。

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

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

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

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

我应该怎么做才能防止此类问题?重新编写代码?还是有一些解决方法可以写入我的会话代码?

谢谢!

【问题讨论】:

  • 您需要更新您的代码。你如何做到这一点取决于你的具体情况。这里没有任何信息可以帮助您。
  • Multiple PHP Sessions 的可能重复项
  • 我想这是一个互相帮助的地方。不管怎么说,还是要谢谢你。我不是编码员。如果答案不在这里,那么肯定在另一个地方。没关系哥们。!晚安!

标签: php session


【解决方案1】:

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

例如,管理区域中的每个session_start() 调用都应以:

session_name("ADMINSESSID");
session_start();

你对 Store 和 Supplier 做类似的事情。

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

登录时:

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

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

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

【讨论】:

  • 目前听起来是个不错的解决方案。我还阅读了 session_save_path() 必须在 session_start() > php.net/session_save_path 之前调用的函数。谢谢@Havenard,我会研究这两种情况并决定什么是更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
相关资源
最近更新 更多