正如对现有答案的评论所表明的那样,提供的解决方案可能并不理想,我想提供一些替代方案。让它成为一个名为 的函数,如下所示:sane_session_name()
function sane_session_name($name)
{
session_name($name);
if(!isset($_COOKIE[$name]))
{
$_COOKIE[$name] = session_create_id();
}
session_id($_COOKIE[$name]);
}
通过在OP的原始代码中使用“理智”的替换,我们得到这个:session_name()
<?php
sane_session_name("session1");
session_start();
$_SESSION["name"] = "1";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_name("session2");
session_start();
$_SESSION["name"] = "2";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_name("session1");
session_start();
echo "<pre>", print_r($_SESSION, 1), "</pre>";
并且它将产生所需的输出:
Array
(
[name] => 1
)
Array
(
[name] => 2
)
Array
(
[name] => 1
)
有什么不同?
为了指出这个答案和突袭者的答案之间的区别:
- 在raidenace的答案中,为网站所有访问者共享的所有客户端创建了两个会话。
- 有了这个答案,为网站的每个访问者创建了两个会话。因此,这将允许在超全球中为访问者Alice和Bob存储不同的内容,而在另外两个网站访问者Alice中,Bob将“共享数据”,并且毫无意义地每次设置以值setac2命名的cookie并来回发送。
$_SESSION
PHPSESSID
安全
为了保护那些“多个(每个用户)会话”免受会话固定和会话劫持,我们可以进一步使用此litte功能
function sane_session_start($name)
{
ini_set("session.use_strict_mode",true);
ini_set("session.cookie_httponly",true);
session_name($name);
if(!isset($_COOKIE[$name]))
{
$_COOKIE[$name] = session_create_id();
}
session_id($_COOKIE[$name]);
session_start();
session_regenerate_id(true);
$_COOKIE[$name] = session_id();
}
并使OP的代码如下所示:
<?php
sane_session_start("session1");
$_SESSION["name"] = "1";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_start("session2");
$_SESSION["name"] = "2";
echo "<pre>", print_r($_SESSION, 1), "</pre>";
session_write_close();
sane_session_start("session1");
echo "<pre>", print_r($_SESSION, 1), "</pre>";