我在网上阅读了大量有关会话安全的内容后,正在编写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);
}
我正在使用的方法我读到here。我修改的唯一内容是session_regenerate_id
删除旧会话,这是我想要的行为。但是,我得到意想不到的结果。 echo
我看起来像这样:
Array()
数组([session_init] =&gt; 1)
分别来自每个print_r
。因此,每次调用该函数时,由于某些原因,我知道会话为空,这会导致它重新生成id并清除已经空的会话,然后设置session_init
。如果我刷新页面,session_init
仍应保存,但事实并非如此。这导致它再次做同样的事情。为什么是这样?我已经尝试评论session_name
和session_set_cookie_params
,但它没有任何区别。
我在本地运行Apache 2.2服务器和PHP 5.3。
答案 0 :(得分: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);
}
?>