0

在网上阅读了很多关于会话安全的内容后,我正在编写一个 PHP 登录脚本。但是,我遇到了一个问题,即页面之间的会话信息不一致。我正在使用的一种方法可能涉及我忽略的一种行为,但我并不完全是 PHP 或会话专家。我遇到问题的代码在head每个页面中调用的会话启动函数中:

//Setup the session
session_name('CPI_SESSION');
session_set_cookie_params(0, '/', $_SERVER['SERVER_NAME'], (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : true), true); 
//Start the session
session_start();

print_r($_SESSION);
echo '<br/>';
if(!isset($_SESSION['session_init']))
{
     session_regenerate_id(true);
     $_SESSION['session_init'] = true;

     print_r($_SESSION);
}

我在这里读到的我正在使用的方法。我唯一修改的是session_regenerate_id删除旧会话,这是我想要的行为。然而,我得到了意想不到的结果。我得到的echo看起来像这样:

数组 ( )
数组 ( [session_init] => 1 )

从每一个print_r分别。因此,每次调用该函数时,出于某种我不知道的原因会话是空的,这会导致它重新生成 id 并清除已经为空的会话,然后设置session_init. 如果我刷新页面,session_init应该仍然保存,但它不是。这会导致它再次做同样的事情。为什么是这样?我试过注释掉session_namesession_set_cookie_params但没有任何区别。

我使用 Apache 2.2 服务器和 PHP 5.3 在本地运行它。

4

1 回答 1

1

这似乎是会话生命周期的问题。[session_set_cookie_params](http://www.php.net/manual/en/function.session-set-cookie-params.php)将会话持续的秒数作为第一个参数。在您的代码中,它设置为 0。尝试像这样将其更改为更高的数字。

<?php
//Setup the session
session_name('CPI_SESSION');
// set session time to 4 hours
session_set_cookie_params(3600*4, '/', $_SERVER['SERVER_NAME'], (isset($_SERVER['HTTPS']) ? true : false), true);      
//Start the session
session_start();

print_r($_SESSION);
echo '<br/>';
if(!isset($_SESSION['session_init']))
{
     session_regenerate_id(true);
     $_SESSION['session_init'] = true;

     print_r($_SESSION);
}
?>
于 2012-07-26T20:04:55.367 回答