2009-08-28 76 views
9

我运行foo.com。我有两个不同的应用程序,它们位于foo.com:一个是foo.com/bar,另一个是foo.com/example。我使用会话来跟踪用户在登录时的信息,但如果用户从foo.com/bar转到foo.com/example,foo.com/example会看到用户从foo.com/开始的会话。并使用该信息。我的问题是,我怎样才能同时为每个目录进行两个不同的会话?在同一个域中有两个不同的会话

+0

如果我们想在django动力项目中实现相同的功能该怎么办? – Dania 2016-07-24 18:59:50

回答

2

您也可以使用相同的会话,但更改您寻找的变量名称。

编辑:对不起,这并不回答你的问题,但给出了一个替代解决方案。

+0

这似乎是最好的解决方案。谢谢。 – Matthew 2009-08-28 18:23:06

+0

感谢马修:请记住,如果它回答你的问题,请记住标记为'答案':) – user103219 2009-08-28 18:29:40

+0

大多数投票答案更好 - 最好的方法是使用'session_name'。 – joryl 2016-04-04 11:21:52

1

您可以使用session_set_cookie_params来设置要保存的会话的域和文件夹。 IE:

// Used on foo.com/example 
session_set_cookie_params(86400, '/example'); 

// Used on foo.com/bar 
session_set_cookie_params(86400, '/bar'); 
+0

这似乎不工作;我尝试过之前(并且刚刚再次)没有成功。这可能与我的全局php.ini设置有关。 – Matthew 2009-08-28 18:24:55

+0

您需要 才能将尾部反斜杠添加到路径。没有它,它肯定无法工作。 – 2009-08-28 18:32:43

+0

如果您有权访问php.ini,则可以尝试直接设置'session.cookie_path'参数,因为这是该函数应该覆盖的参数。如果您无权访问php.ini文件,也可以使用ini_set()。 – 2009-08-28 18:33:22

0

另一种解决方案是通过将“bar_”的foo.com/bar和具有“example_”的foo.com/example的所有会话值预先挂起,在会话中有效地创建一个名称空间。

您可以避免繁琐的方法是将此功能抽象为函数或类方法。例如:

function set_session_value($key, $value) { 

    //figure out which prefix to use by checking the current working 
    //directory, or whatever method you like. set $prefix equal to 
    // "bar_" or "example_". 

    $_SESSION[$prefix . $key] = $value; 
} 

然后通过匹配函数获取您的值。

这样做的主要优点是,您不必考虑在/ example中编写/ bar时使用的变量名称。另一个是如果你决定改变你如何存储会话值,你可以很容易地在一个地方改变一切。

41

您应该在致电session_start之前致电session_name。这设置用于标识会话的cookie的名称(默认情况下,这是PHPSESSID)。

为每个应用程序使用不同的名称。你不应该混淆会话中的变量。

+6

+1:这确实是保持应用程序会话分离的最佳方式。 – Powerlord 2009-08-28 18:59:39

+1

让他们分开的最佳解决方案。给+1 – eHussain 2011-09-21 06:15:04

0

我意识到这是旧的,但认为它可能有助于某人。此示例显示了我们如何为我们的管理区域设置单独的会话。

if ($_SERVER['REQUEST_URI'] == '/admin/'): 
    $session_name = 'session1'; 
else: 
    $session_name = 'session2'; 
endif; 
session_start($session_name); 
4

我认为强调与目前提供的解决方案相关的潜在安全隐患是非常重要的。 我一直是一个Web应用程序渗透测试人员,已经有5年的时间了,并且在这个时候开发了许多易受攻击的安全应用程序,以协助培训从IT安全开始的青少年。

我刚刚测试过提供的解决方案,并注意到它们中没有一个阻止访问属于相邻应用的会话。在session_name()中使用不同的会话标识符名称不会阻止用户使用这些标识符的值。 PHP没有为每个会话标识符名称分隔存储。我有两个应用程序使用不同的会话名称并为浏览器设置了Cookie路径。以下各的Set-Cookie指令都包含在HTTP响应:

Set-Cookie: TESTONE=<value one>; path=/testone/ 

Set-Cookie: TESTTWO=<value two>; path=/testtwo/ 

如果同时应用了完全独立的用户,有人只有进入/testtwo/应用程序,它们可能能够在/testone/应用程序依赖于访问信息会话参数的处理方式。下面的示例代码段显示了潜在的数据泄露,假设两个应用程序在成功验证后使用$_SESSION["authenticated"]参数。

<?php 
    session_name("TESTONE"); 
    ini_set("session.cookie_path","/testone/"); 
    session_start(); 
    if ($_SESSION["authenticated"] == "yes") 
     echo $topsecretinfo; 
?> 

要访问此$topsecretinfo一个只需要在/testtwo/应用验证,把他们的TESTTWO会话标识符的价值,将请求发送到/testone/应用程序时使用它作为TESTONE会话标识符的值。 PHP的会话查找过程不会识别会话标识的名称,除非解析相应的值。即,“agcy648dja6syd8f93”的会话标识符值将返回相同的会话对象,而不管用于引用它的名称。

相关问题