PHP session_regenerate_id(true)可能的cookie竞争条件?

时间:2016-01-23 14:43:40

标签: php session cookies session-variables session-cookies

我有<form method="post" action="login_handler.php>的PHP登录页面( login_page.php ) 在 login_page.php 的顶部,我致电session_start(); 我存储一个控制字符串$_SESSION['xss_check']以防止XXS。

用户输入用户名&amp;密码并单击登录 login_handler.php 处理其凭据并重定向到登录的网站。 然后在 login_handler.php 的顶部,我再次致电session_start()session_regenerate_id(true)

据我所知session_regenerate_id(true)保存旧的$_SESSION变量, 创建一个新会话并删除旧会话。

我的问题是$_SESSION删除session_regenerate_id(true)数据,并且不会删除旧会话(我的会话存储文件夹会在每次调用后堆积会话文件。 我的$_SESSION['xss_check']变量已消失,因此我的脚本失败,用户无法再登录。 现在我不确定我是否理解正确使用session_regenerate_id()或者我是否在错误的地方使用它?

我阅读了很多帖子,除了不使用session_regenerate_id()之外我找不到解决方案,但我想阻止会话固定。

我的代码

    // start session; this runs at the top of every page as function to start or resume session  
    $cookieparams = session_get_cookie_params();
    $path = ini_get("session.save_path");
    $cookieparams['path'] = $path;
    session_set_cookie_params($lifetime, $cookieparams["path"], $cookieparams["domain"], false, true);
    setcookie('c_check', '1', 0);
    if  (session_start()) {
        if (isset($_COOKIE['c_check']) && $_COOKIE['c_check'] === "1") {
            $_SESSION['COOKIES_ON'] = true;
        } else {
            $_SESSION['COOKIES_ON'] = false;
        }
    } else {
        // session failed to start
    }


    // the next code runs at the start of login_handler.php to regenerate session
    session_regenerate_id(true);
    if (!isset($_SESSION['LIFETIME'])) {
        $_SESSION['LIFETIME'] = time();
    } else if (time() - $_SESSION['LIFETIME'] > 600) {
        session_regenerate_id(true);
        $_SESSION['LIFETIME'] = time();
    } else if (time() - $_SESSION['LIFETIME'] > $lifetime) {
        session_unset();
        session_destroy();
        header('Location: http://localhost/session_expired.php');
        exit();
    }

我确定我做错了什么......我只是不知道是什么! 任何意见都表示赞赏,并提前感谢!!

0 个答案:

没有答案