Php 会话\u重新生成\u id(true)ajax请求上的无效会话或快速刷新

Php 会话\u重新生成\u id(true)ajax请求上的无效会话或快速刷新,php,session,Php,Session,为了避免会话固定,我在每个PHP页面的开头使用以下代码: session_set_cookie_params( 900, '/', $domain, 1, 1 ); session_start(); session_regenerate_id( true ); 但是,如果页面刷新过快或出现多个ajax请求,会话id将无效 有一种方法可以避免会话固定而不出现此问题?使用http_only cookie标志,这将防止通过xss攻击劫持会话id。几乎所有现代浏览器都支持它。对于较旧的浏览器,请确保代

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

session_set_cookie_params( 900, '/', $domain, 1, 1 );
session_start();
session_regenerate_id( true );
但是,如果页面刷新过快或出现多个ajax请求,会话id将无效


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

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

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

您还可以基于时间或计数重新生成。希望有帮助

以下是如何每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);   
}
//将会话名称设置为上面设置的名称。
会话名称($session\u name);
//启动PHP会话
会话_start();
//首次设置上次重新生成会话变量
如果(!isset($_会话['last_regen'])){
$\会话['last\ u regen']=时间();
} 
//以秒为单位设置会话再生时间
$session_regen_time=60*5;
//仅当上次重新生成时间早于给定的重新生成时间时,才重新生成会话id。
如果($\会话['last\ u regen']+$SESSION\ u regen\ u time
谢谢!我已经使用了session_set_cookie_参数(900,“/”,$domain,1,1);因此,我可以删除会话\重新生成\ id(true);对吗?使用session_regenrate_id是一种很好的做法,但要明智地使用它。在会话中使用一些变量,它可能是时间或计数器。对于每个请求,请检查它,如果过期,则重新生成会话id,如。。。如果($_SESSION['counter']%1000==0){REGENATE}或($_SESSION['time']>time()+1hr,以秒计){REGENATE}无法使用快速页面刷新和ajax调用。我多次遇到这种行为-会话id是使用会话\u REGENATE\u id(true)重新生成的-但出于某些(愚蠢的?)原因,php仍然使用旧的会话id,旧的会话id已经过时,因此$\u会话为空。