Inlog controle
Goedemorgen,
Ik vroeg me af hoe ik het beste kon controleren of iemand ingelogd is, het kan natuurlijk heel makkelijk met if($_SESSION['logged_in'] == true), ik wil wat betrouwbaarders.
Situatie nu: Als een user inlogt wordt er een key generate van 150 cijfers/letters deze wordt in mijn database gezet.
Hierna controleer ik deze met:
if($user = is_user_logged_in()){ ...
Is dit waterdicht?
Ik vroeg me af hoe ik het beste kon controleren of iemand ingelogd is, het kan natuurlijk heel makkelijk met if($_SESSION['logged_in'] == true), ik wil wat betrouwbaarders.
Situatie nu: Als een user inlogt wordt er een key generate van 150 cijfers/letters deze wordt in mijn database gezet.
Hierna controleer ik deze met:
if($user = is_user_logged_in()){ ...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
function is_user_logged_in(){
if(isset($_SESSION[NAME]['auth_key'])){
$query = mysql_query("
SELECT
users.username,
roles.name
FROM
sessions,
users,
user_role,
roles
WHERE
sessions.auth_key = '".mysql_real_escape_string($_SESSION[NAME]['auth_key'])."'
AND
sessions.ip = '".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."'
AND
sessions.date + interval 10 minute > now()
AND
sessions.user_id = users.id
AND
user_role.user_id = users.id
AND
user_role.role_id = roles.id
");
if($query === false){
//echo mysql_error();
}
elseif(mysql_num_rows($query) > 0) {
mysql_query("UPDATE sessions SET date = now() WHERE auth_key = '".mysql_real_escape_string($_SESSION[NAME]['auth_key'])."'");
return mysql_fetch_assoc($query);
}
}
return false;
}
?>
function is_user_logged_in(){
if(isset($_SESSION[NAME]['auth_key'])){
$query = mysql_query("
SELECT
users.username,
roles.name
FROM
sessions,
users,
user_role,
roles
WHERE
sessions.auth_key = '".mysql_real_escape_string($_SESSION[NAME]['auth_key'])."'
AND
sessions.ip = '".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."'
AND
sessions.date + interval 10 minute > now()
AND
sessions.user_id = users.id
AND
user_role.user_id = users.id
AND
user_role.role_id = roles.id
");
if($query === false){
//echo mysql_error();
}
elseif(mysql_num_rows($query) > 0) {
mysql_query("UPDATE sessions SET date = now() WHERE auth_key = '".mysql_real_escape_string($_SESSION[NAME]['auth_key'])."'");
return mysql_fetch_assoc($query);
}
}
return false;
}
?>
Is dit waterdicht?
Gewijzigd op 07/03/2012 09:41:33 door Gerhard l
het het altijd goed wat kan er in misgaan
voor uitloggen gebruik je session_kill();
je maakt het alleen maar ingewikkeld als je die code bij de url gebruikt zoals die je ziet in een phpbb forum!
voor uitloggen gebruik je session_kill();
je maakt het alleen maar ingewikkeld als je die code bij de url gebruikt zoals die je ziet in een phpbb forum!
@Remco, session_kill?? Heb je een nieuwe functie bedacht? session_destroy() ken ik wel :)
Het controleren op ip adres raad ik ten zeerste af, zogauw iemand ergens anders inlogged, of met zijn telefoon / tablet zal diegene dus niet kunnen inloggen?
Opzich is er verder niks mis met jouw script zover ik het zie.
Het controleren op ip adres raad ik ten zeerste af, zogauw iemand ergens anders inlogged, of met zijn telefoon / tablet zal diegene dus niet kunnen inloggen?
Opzich is er verder niks mis met jouw script zover ik het zie.
HET STOND IN EEN INLOG SCRIPT DAT GEBRUIKT MAAKT VAN PHPBB
DAT KAN HET ZIJN?
DAT KAN HET ZIJN?
Je hoeft niet zo te SCHREEUWEN.
Toevoeging op 10/03/2012 12:17:13:
En omdat het in een script stond, zou het, dus, goed zijn?
Heb hier heel veel scripts voorbij zien komen, waar toch echt nog wel wat (kleine) puntjes voor verbetering vatbaar bleken.
Toevoeging op 10/03/2012 12:17:13:
Obelix en Idefix op 10/03/2012 12:16:24:
Je hoeft niet zo te SCHREEUWEN.
En omdat het in een script stond, zou het, dus, goed zijn?
Heb hier heel veel scripts voorbij zien komen, waar toch echt nog wel wat (kleine) puntjes voor verbetering vatbaar bleken.
@Remco Ik snap niet zo veel van je reactie, sessions kill en code in url, daar maak ik geen gebruik van.
@Phoenix Als ik alleen op ip zou controleren zou dat kloppen, maar het is in combinatie het een unieke code, dus hij zou gewoon op 2 plekken kunnen inloggen. Alleen als de code niet meer matched met het ip, wordt de persoon uitgelogd.
edit:
Stel dat ik op 2 apparaten zou inloggen, zou hij dus 2 sessions toevoegen aan de database, waardoor de website dus ook al weergeven dat 2x bijv. Gerhard online is... Het is dus beter om zonder ip te doen, en dan gewoon de gegenereerde code ophalen via user_id?
@Phoenix Als ik alleen op ip zou controleren zou dat kloppen, maar het is in combinatie het een unieke code, dus hij zou gewoon op 2 plekken kunnen inloggen. Alleen als de code niet meer matched met het ip, wordt de persoon uitgelogd.
edit:
Stel dat ik op 2 apparaten zou inloggen, zou hij dus 2 sessions toevoegen aan de database, waardoor de website dus ook al weergeven dat 2x bijv. Gerhard online is... Het is dus beter om zonder ip te doen, en dan gewoon de gegenereerde code ophalen via user_id?
Gewijzigd op 10/03/2012 12:47:41 door gerhard l
Om toch op ipadres te controleren kan je gebruik maken van een session tabel in de database. Elke keer wanneer iemand inlogt worden de sessiegegevens opgeslagen in deze tabel. Deze sessie is dan gelockt op een bepaald ipadres. Op deze manier kan je een 99,9% waterdicht systeem krijgen die tevens controleert op ipadres.
Gerhard l op 07/03/2012 09:34:37:
Hierna controleer ik deze met:
if($user = is_user_logged_in()){ ...
if($user = is_user_logged_in()){ ...
Kan je beter met == doen.
Is NAME een constante in $_SESSION[NAME]['auth_key']?
@Arjan bedankt ik ga hier naar kijken.
@SanThe bedankt, zal ik aanpassen. En ja NAME is een constante, zo kan ik m'n verschillende sessies van scripts gescheiden houden.
- SanThe - op 10/03/2012 14:44:11:
Kan je beter met == doen.
Is NAME een constante in $_SESSION[NAME]['auth_key']?
Gerhard l op 07/03/2012 09:34:37:
Hierna controleer ik deze met:
if($user = is_user_logged_in()){ ...
if($user = is_user_logged_in()){ ...
Kan je beter met == doen.
Is NAME een constante in $_SESSION[NAME]['auth_key']?
@SanThe bedankt, zal ik aanpassen. En ja NAME is een constante, zo kan ik m'n verschillende sessies van scripts gescheiden houden.




