Hallo mensen ben ik weer met een vraagje.

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.
Laten we dan eens kijken wat we nou eigenlijk doen.

Elke sessie heeft een eigen, unieke sessie-ID. De cookie-UUID maakt daarvan een geldige sessie — of meer precies: een sessie met een bekende user-ID.

Zou je de cookie-UUID nooit veranderen, dan krijg je iets dat lijkt op een eeuwigdurende sessie. Dat is het echter niet: het is een keten van opeenvolgende sessies met eigen sessie-ID's. Alles dat je daarbij in eerdere sessie hebt opgeslagen, gaat verloren. De nieuwe sessie bevat in deze opzet namelijk enkel en alleen de user-ID.

Er is dus vooral een directe één-op-één-relatie tussen de cookie-ID en de user-ID. Dat je het geheel beheert via sessies, is daarin maar bijzaak.

Voor de beveiliging betekent dit dat je dit cookie slechts beperkt moet vertrouwen: het geeft het vermoeden dat je te maken hebt met de user-ID van een terugkerende bezoeker. Niet meer, niet minder.

De rest van de beveiliging moet je daarop voortbouwen: wanneer is dat vermoeden voldoende en wanneer niet? Bijvoorbeeld voor het wijzigen van het wachtwoord, een e-mailadres en andere account- of gebruikersgegevens zul je dan opnieuw inloggen verplicht moeten stellen. Sommige webwinkels gebruiken vergelijkbare criteria: je kunt als terugkerende klant direct gaan winkelen, maar als je de order wilt bevestigen of wilt afrekenen, moet je even opnieuw inloggen.


Momenteel set ik een cookie die 30 dagen geldig is. Maar het is me al opgevallen dat iedere keer dat ik weer op de site kom de cookie niet vanzelf wordt bijgewerkt. Uiteindelijk zal je dus na 30 dagen weer afgemeld zijn zelfs als je er elke dag komt. Dat zou ik dus ook voorkomen als ik iedere keer een nieuwe cookie set.
Helaas ben ik er achter gekomen dat deze methode helaas niet werkt.
Wanneer je namelijk op je pc en telefoon inlogt en je kiest bij beide voor onthouden dan veranderd de code in de db waardoor je op het andere apparaat automatisch bent uitgelogd. :(

Iemand ideeen?
Gewoon met een koppeltabel werken zodat je meerdere "sessies" aan 1 gebruiker kunt hangen? Dan kun je per entry ook een maximale levensduur hangen zodat je bijvoorbeeld na een maand of een jaar zonder gebruik van een bepaalde hash deze kan uitwissen.

Reageren