session_regenerate_id(true)ajax请求或快速刷新时的会话无效


session_regenerate_id(true) invalid session on ajax requests or fast refresh

为了避免会话固定,我在每个PHP页面的开头都使用以下代码:

session_set_cookie_params( 900, '/', $domain, 1, 1 );
session_start();
session_regenerate_id( true );

但是,如果页面刷新过快或出现多个ajax请求,则会话id将变为无效。

有没有一种方法可以避免会话固定而不会出现这个问题?

以下是如何每5分钟只重新生成会话id的示例,例如:

    // Sets the session name to the one set above.
session_name($session_name);
// Start the PHP session
session_start();             
// Set last regen session variable first time
if (!isset($_SESSION['last_regen'])) {
    $_SESSION['last_regen'] = time();
} 
// Set session regeneration time in seconds
$session_regen_time = 60*5;
// Only regenerate session id if last_regen is older than the given regen time. 
if ($_SESSION['last_regen'] + $session_regen_time < time()){
    $_SESSION['last_regen'] = time();
    session_regenerate_id(true);   
}

使用http_only cookie标志,这将防止通过xss攻击劫持会话id。几乎所有现代浏览器都支持它。对于较旧的浏览器,请确保代码中没有xss漏洞。如果可能的话,也可以使用安全标志来保护网络层的安全。

void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )

您也可以按时间或计数重新生成。希望它能有所帮助!