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