I am working on a project where users have to log in then if it is correct it creates a cookie to process requests. I would like to find a way to auto-renew sessions every day without affecting the user or requiring the user to log in again.
I would like to also know if I overlooked any security flaws such as SQL injection or session-hijacking and all those, are there any other one that I could prevent or improve?
The login page is
<?php
//Login.php
if(isset($_POST['username']) && isset($_POST['password'])){
$username = filter_input(INPUT_POST, "username", FILTER_SANITIZE_ENCODED, FILTER_FLAG_STRIP_HIGH); //Changes to unicode characters to prevent injection
$password = $_POST['password']; //Get password
$result = LoginManager::Login($username, $password); //Run login method
if($result == "invalid_username"){
echo 'Invalid Username!';
}
if($result == "invalid_login"){
echo 'Invalid Login!';
}
$expires = gmdate('Y-m-d', strtotime($Date. ' + 1 days')); //sessions expire in 1 day
DataBase::query("INSERT INTO sessions VALUES(:session, :userid, :expires)", array(':session' => $result, ':userid' => $userid, ':expires' => $expires)); //insert into database
setcookie("session", $result); //set as cookie
return;
}
echo '<form action="Login.php" method="post">
<p>Username: <input type="text" name="username" placeholder="Username"/></p>
<p>Password: <input type="password" name="password" placeholder="Password"/></p>
<p><input type="submit" name="login" value="Login"/></p>
</form>';
?>
The LoginManager class
<?php
//LoginManager.php
public static function Login($username, $password){
if(strlen($username) > 16 || strlen($password) > 50 || strlen($password) < 5){ //usernames less than 16, password from 5-50 char
return 'invalid_bounds';
}
$sql = "SELECT * from accounts WHERE username = :username";
$users = Database::query($sql, array(':username' => $username)); //get account
if(sizeof($users) == 0){ //no accounts found
return 'invalid_username';
}
$userdata = $users[0];
$salt = '-45dfeHK/__yu349@-/klF21-1_\/4JkUP/4'; //salt for password
if(password_verify($password . $salt, $userdata['password'])){ //check if password is correct
$session = com_create_guid(); //create unique session
return $session;
}else{
return 'invalid_login';
}
}
?>
And the main page / feed
<?php
//Main.php
$session = $_COOKIE['session']; //get cookie session
$sessions = DataBase::query('SELECT * FROM sessions WHERE id=:id', array(':id' => $session));
if(sizeof($sessions) == 0){
//Redirect to login page
return;
}
//get first session
$session = $sessions[0];
$date = new DateTime($session['expires']);
$now = new DateTime();
if($date < $now) {
//Expired session : Redirect to login
return;
}
//Display feed
?>