【问题标题】:session_regenerate_id(true) invalid session on ajax requests or fast refreshsession_regenerate_id(true) ajax 请求或快速刷新的无效会话
【发布时间】:2013-07-15 14:56:23
【问题描述】:

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

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

但是如果页面刷新过快或者有多个ajax请求的情况下,session id就会失效。

有没有办法避免会话固定而没有这个问题?

【问题讨论】:

    标签: php session


    【解决方案1】:

    以下是如何仅每 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);   
    }
    

    【讨论】:

    • 不适用于快速页面刷新和 ajax 调用。我多次遇到这种行为 - 会话 ID 是使用 session_regenerate_id(true) 重新生成的 - 但由于某些(愚蠢的?)原因,php 仍然相信旧的会话 ID,它已经过时,因此 $_SESSION 是空的。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢!我已经使用 session_set_cookie_params( 900, '/', $domain, 1, 1 );所以我可以删除 session_regenerate_id( true );对吗?
    • 使用 session_regenrate_id 是个好习惯,但要明智地使用它。在会话中取一些变量,可能是时间或计数器。对于每个请求,请检查它,如果过期则重新生成您的会话 ID,例如... if( $_SESSION['counter'] % 1000 == 0 ){regenerate} 或 if( $_SESSION[ 'time' ] > time() + 1 小时(秒){regenerate}
    猜你喜欢
    • 2015-11-01
    • 2020-07-13
    • 1970-01-01
    • 2019-04-28
    • 2019-10-13
    • 1970-01-01
    • 2020-07-01
    • 2015-08-04
    • 2011-09-08
    相关资源
    最近更新 更多