Php 在同一个域中有两个不同的会话

Php 在同一个域中有两个不同的会话,php,Php,我经营foo.com。我在foo.com上有两个不同的应用程序:一个是foo.com/bar,另一个是foo.com/example。我使用会话跟踪用户登录时的信息,但如果用户从foo.com/bar转到foo.com/example,foo.com/example会看到用户从foo.com/bar启动的会话并使用该信息。我的问题是,如何让每个目录同时运行两个不同的会话?您可以使用设置要保存会话的域和文件夹。即: // Used on foo.com/example session_set_co

我经营foo.com。我在foo.com上有两个不同的应用程序:一个是foo.com/bar,另一个是foo.com/example。我使用会话跟踪用户登录时的信息,但如果用户从foo.com/bar转到foo.com/example,foo.com/example会看到用户从foo.com/bar启动的会话并使用该信息。我的问题是,如何让每个目录同时运行两个不同的会话?

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

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

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

您也可以使用相同的会话,但可以更改所查找的变量名


编辑:很抱歉,这没有回答您的问题,但提供了另一种解决方案。

另一种解决方案是通过预先挂起foo.com/bar和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;
}
然后使用匹配函数获取值

这样做的主要优点是,在/bar中编程时,不必考虑在/example中使用的变量名。另一个是,如果您决定更改会话值的存储方式,您可以在一个位置轻松地更改所有内容。

您应该在调用session\u start之前调用。这将设置用于标识会话的cookie的名称(默认情况下为PHPSESSID)


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

我意识到这很旧,但我认为它可能会帮助某些人。这个例子展示了我们如何为我们的管理区域设置一个单独的会话

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

我认为强调与目前提供的解决方案相关的潜在安全影响非常重要。 我已经做了大约5年的web应用程序渗透测试人员,并在这段时间开发了许多易受攻击的安全应用程序,以帮助初级IT安全培训

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

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

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

要访问此
$topsecretinfo
只需在
/testtwo/
应用程序上进行身份验证,在向
/TESTONE/
应用程序发送请求时,获取其
testtwo
会话标识符的值,并将其用作
TESTONE
会话标识符的值。除了解析相应的编码值外,PHP的会话查找过程不识别会话标识符的名称。i、 e.会话标识符值“agcy648dja6syd8f93”将返回相同的会话对象,而不管用于引用该对象的名称如何。

这似乎是最佳解决方案。谢谢。谢谢。马修:记住,如果它回答了你的问题,记得把它标记为“答案”:)多数投票的答案更好——最好的方法是使用“会话名称”。这似乎不起作用;我以前试过(现在又试过)但没有成功。这可能与我的全局php.ini设置有关。您需要在路径中添加尾随的反斜杠。如果您可以访问php.ini,您可以尝试直接设置'session.cookie_path'参数,因为该函数应该覆盖该参数。如果您没有访问php.ini文件的权限,也可以使用ini\u set()。根据“如果您想使用
session\u-name()
,必须先使用
session\u-set\u-cookie\u-params()
…否则它将无法工作,不会给出任何错误,文档中的任何内容(无论如何,我已经看到)都无法解释原因。”我还没有证实这一点。+1:这确实是保持应用程序会话分离的最佳方法。保持它们分离的最佳解决方案。给出+1如果我们想在django支持的项目中实现相同的功能,该怎么办?另请参见:。它似乎不接受该格式的名称。它希望是一个“覆盖当前设置的选项的关联数组”。这是一篇老文章,它适用于我们在2012年使用的任何PHP版本。
<?php 
    session_name("TESTONE");
    ini_set("session.cookie_path","/testone/");
    session_start();
    if ($_SESSION["authenticated"] == "yes")
        echo $topsecretinfo;
?>