Во-первых, что наиболее важно, при входе в систему вы должны генерировать новый идентификатор сеанса, а не повторно использовать тот, который хранится в вашей базе данных. Точка, в которой пользователь входит в систему, должна использоваться для запуска всех свойств сеанса fre sh. Как сказал droopsnoot, вы должны хранить ha sh пароля, а не сам пароль, это фундаментальная процедура c безопасности, а не эзотери c людей.
<?php
//require('Cookie.php'); //Not sure what's in here
require('User.php'); //Add to this class a hash of the password $user->pwhash
//require('DbConnection.php'); //Can't tell what's in here
session_destroy();
ini_set('session.cookie_lifetime', 0); //Pick your time here
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.use_strict_mode', 1);
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1);
ini_set('session.cookie_samesite', 'Strict');
ini_set('session.use_trans_sid', 0);
ini_set('session.hash_function', 'sha512');
ini_set('session.sid_length', '64'); //Use the generated sid
session_start();
$forhash=random_bytes(256); //I prefer to create my own
$hash = openssl_digest($forhash, "sha256");
$sid = base64_encode($hash);
$sid = substr($sid, 10, 64);
$_SESSION['sessionID']=$sid;
$obj = new stdClass();
$obj->dateread = date("D M j G:i:s T Y");
$obj->message = '';
$obj->error = '';
if(!($login=@$_POST["login"])){
echo '<p>No login was entered.</p>';
exit;
}else {
$login=$_POST["login"];
}
if(!($pass=@$_POST["pass"])){
echo '<p>No pass was entered.</p>';
exit;
}else {
$pass=$_POST["pass"];
}
$user = new User($login, $pass); //do not store the password in this object, only store the hash
$db = new mysqli('localhost', $dbuser, $userpw, $database);
if (mysqli_connect_errno()) {
echo 'Error: Could not connect to database.';
$obj->error = $obj->error.'Could not connect to database. '.__FILE__.__LINE__;
error_log(json_encode($obj));
exit;
}else{
$obj->message = $obj->message.'Successfully connected to database. ';
}
$query = "UPDATE users SET sessid = ? WHERE login = ? AND pwhash = ?";
$stmt = $db->prepare($query);
$stmt->bind_param('sss', $sid, $login, $user->pwhash);
$stmt->execute();
if($db->affected_rows == 1){
echo echo json_encode(array('islogin' => true)); //or whatever else you might do here
}else{
echo json_encode(array('islogin' => false));
exit;
}
$db->close();
?>
Затем на последующих других страницах, пока пользователь находится в системе:
<?php
session_start();
if(!isset($_SESSION['sessionID']))
{
echo 'You are not logged in. Please <a href="https://yousite.com/logout.php">click here</a>.';
exit;
}else{
$sid = $_SESSION['sessionID'];
}
require('User.php');
//require('DbConnection.php'); //Still don't know what's here
$user = new User;
$obj = new stdClass();
$obj->dateread = date("D M j G:i:s T Y");
$obj->message = '';
$obj->error = '';
$db = new mysqli('localhost', $dbuser, $userpw, $database);
if (mysqli_connect_errno()) {
echo 'Error: Could not connect to database.';
$obj->error = $obj->error.'Could not connect to database. '.__FILE__.__LINE__;
error_log(json_encode($obj));
exit;
}else{
$obj->message = $obj->message.'Successfully connected to database. ';
}
$query = "SELECT email, phone, whatever FROM users WHERE sessid = ?";
$stmt = $db->prepare($query);
$stmt->bind_param('s', $sid);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($email, $phone, $whatever);
if (mysqli_connect_errno()) {$obj->error = 'Error: Could not connect to database. ';
echo json_encode($obj);
error_log(json_encode($obj));
exit;
}
else{
if($stmt->num_rows == 1) {
echo json_encode(array('islogin' => true)); //or whatever else you might do beside this
while($stmt->fetch()){
$user->setEmail($email);
$user->setPhone($phone);
$user->setWhatever($whatever);
}
} elseif($stmt->num_rows == 0) {
$obj->message=$obj->message.'Session not found. ';
echo json_encode(array('islogin' => false));
} else {
$obj->error = 'Database Error: Sessions not 1 or 0. ';
echo json_encode($obj);
error_log(json_encode($obj));
exit;
}
}
$db->close();
?>