Ik heb een website gemaakt met een loginsysteem dmv $_SESSIONS maar nu klaagde sommige mensen dat ze iedere keer uitgelogd waren. Ik vond het zelf ook wel vervelend dus ik heb nu een $_COOKIE variant verzonnen maar omdat het mijn eerste keer is heb ik daar toch wel twijfels over.
Daarom hoor ik hier graag op of aanmerkingen. (In mijn $_SESSION sla ik de userid van het ingelogde account op waardoor je op iedere pagina bent aangemeld.)
Ten eerste heb ik in mijn database een tabel gemaakt met de kolommen:
- id (PRIMARY,AUTO_INCREMENT)
- userid
- cookiehash (UNIQUE)
- timestamp
Vervolgens heb ik dit in mijn inlogscript verwerkt:
<?php
// Als "Onthoud Mij" is aangeklikt
if(isset($_POST['onthoudmij'])) {
$cookiehash = md5(uniqid(microtime(), true));
$SQLSelectLoginSessies = "SELECT userid
FROM login_sessies
WHERE userid = '" . $row['id'] . "'";
$ResultLoginSessies = $conn->query($SQLSelectLoginSessies);
if ($ResultLoginSessies->num_rows > 0) {
$sqlUpdateLoginSessies = "UPDATE login_sessies
SET cookiehash='" . $cookiehash . "'
WHERE userid='" . $row['id'] . "'";
if ($conn->query($sqlUpdateLoginSessies) === TRUE) {
setcookie("Onthoudmij", $cookiehash, time() + (86400 * 30), "/", null, true, true); // 30 dagen
header('Location: ' . $terug . '');
exit;
} else {
header('Location: ' . $pagina . '&code=0003'); // Kan cookie niet zetten.
exit;
}
} else {
$SQLInsertLoginSessies = "INSERT INTO login_sessies (userid,cookiehash)
VALUES ('" . $row['id'] . "','" . $cookiehash . "')";
if ($conn->query($SQLInsertLoginSessies) === TRUE) {
setcookie("Onthoudmij", $cookiehash, time() + (86400 * 30), "/", null, true, true); // 30 dagen
header('Location: ' . $terug . '');
exit;
} else {
header('Location: ' . $pagina . '&code=0003'); // Kan cookie niet zetten.
exit;
}
}
}
?>
En bovenaan mijn index.php pagina dit:
<?php
// Check voor Cookie
if(isset($_COOKIE['Onthoudmij'])) {
$CheckCookie = mysqli_real_escape_string($conn,$_COOKIE['Onthoudmij']);
$SQLCheckCookie = "SELECT userid,cookiehash
FROM login_sessies
WHERE cookiehash = '" . $CheckCookie . "'";
$ResultCheckCookie = $conn->query($SQLCheckCookie);
if ($ResultCheckCookie->num_rows > 0) {
while($RowLoginSessies = $ResultCheckCookie->fetch_assoc()) {
$_SESSION['user'] = $RowLoginSessies['userid'];
}
}
}
?>
Dus wanneer er een cookie is gevonden op de clïent met een hash die overeenkomt met een hash in mijn tabel dan wordt dezelfde sessie gemaakt als wanneer je voorheen met sessies inlogde.
Doordat de kolom cookiehash in mijn tabel UNIQUE moet zijn kan je nooit een andere userid krijgen.