I have a PHP login page (login_page.php) with <form method="post" action="login_handler.php>
At the top of login_page.php I call session_start();
I store a control string $_SESSION['xss_check']
to prevent XXS.
After a user enters username & password and clicks login login_handler.php processes their credentials and redirects to the website logged in.
Then at the top of login_handler.php I call session_start()
again and session_regenerate_id(true)
To my understanding session_regenerate_id(true)
saves old $_SESSION
variables,
creates a new session and deletes the old one.
My problem is that $_SESSION
data is deleted by session_regenerate_id(true)
, and the old session is not deleted (my session storage folder piles up session files after each call.
And my $_SESSION['xss_check']
variable is gone so my script fails and users can't login anymore.
Now I'm not sure if I understand the use of session_regenerate_id()
correctly or if i'm using it in the wrong place?
I read through a lot of posts and I can't find a solutions other than just not using session_regenerate_id()
but I want to to prevent session fixation.
my code
// 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();
}
I'm sure I'm doing something wrong.... I just don't know what!
Any input is appreciated and thanks in advance!!