Cookies en het stelen ervan
Ik ben bezig met een onthoud mij functie voor mijn website.
Nu heb ik de code als volgt:
Code (php)
1
2
3
4
2
3
4
if($remember_me == '1'){
setcookie("email", $email, $hour);
setcookie("password", $password, $hour);
}
setcookie("email", $email, $hour);
setcookie("password", $password, $hour);
}
Daar maak ik dus de cookie
Vervolgens lees ik die uit op de volgende manier:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(!empty($_COOKIE['email']) && !empty($_COOKIE['password'])){
// Gegevens uit database ophalen.
$sql = "SELECT * FROM users WHERE email='" . $_COOKIE['email'] . "' " . "AND password='" . $_COOKIE['password'] . "' AND activated='1'";
$result = mysql_query($sql, $thecode) or die ('Kan gebruikersnaam niet controleren...<br />Misschien is er een probleem met de database...');
if (($row = mysql_fetch_array($result)) == 0){
$error_wrong_cookie = 'true';
$error = 'true';
}
else{
$_SESSION['id'] = $row['id'];
$_SESSION['email'] = stripslashes($row['email']);
$_SESSION['password'] = stripslashes($row['password']);
$_SESSION['logged_in'] = 'true';
}
}
// Gegevens uit database ophalen.
$sql = "SELECT * FROM users WHERE email='" . $_COOKIE['email'] . "' " . "AND password='" . $_COOKIE['password'] . "' AND activated='1'";
$result = mysql_query($sql, $thecode) or die ('Kan gebruikersnaam niet controleren...<br />Misschien is er een probleem met de database...');
if (($row = mysql_fetch_array($result)) == 0){
$error_wrong_cookie = 'true';
$error = 'true';
}
else{
$_SESSION['id'] = $row['id'];
$_SESSION['email'] = stripslashes($row['email']);
$_SESSION['password'] = stripslashes($row['password']);
$_SESSION['logged_in'] = 'true';
}
}
Als de cookie email en wachtwoord niet leeg zijn kijk dan of die voorkomen in de database.
Komt het niet overeen om 1 of andere reden dan krijg je een error anders worden de sessie gevuld.
Het werkt opzich wel alleen vraag ik me af of de implementatie wel goed is aangezien ik dit nog nooit gedaan heb. Tevens vraag ik mij ook af of de cookie niet gestolen kan worden en indien dat het geval is er zomaar ingelogd kan worden?
Ik kan me voorstellen als iemand een cookie steelt met de goede username en password en deze bij zichzelf weet te plaatsen hij/ zij zo kan inloggen als deze gebruiker met bijbehorende rechten?
GVD: empty is een zinlose functie die je uit je code dient te verbannen, pas correcte validatie toe!
-> ctype_
-> preg_
-> != '' == ''
een onthoud coekie heeft 1 of meerdere waarden waarmee te zamen met 1 of meerdere waarden opgelsagen bij de user een hash is opgeslagen
voorbeeld:
cookie:
- username
database
- lastactive
- registratiedatum
de hash sla je dan op in database tabel bij de user
voor de rest mag je het zelf uitzoeken / uitwerken
Gewijzigd op 01/10/2010 22:36:47 door Noppes Homeland
Waarom een persoon op zo'n manier aanvallen omdat hij alleen empty gebruikt?
empty() is hetzelfde als == ''. Hoezo moet je dat opeens verbannen. Ik sla ook geen wachtwoord op in een cookie, maar de md5 waarde van het wachtwoord.
Ik vroeg me alleen af, stel iemand steelt deze cookie op 1 of andere manier met emailadres en de md5 waarde van het wachtwoord. Kan deze gebruiker dan inloggen?
Maar dit wist je natuurlijk al aangezien je mijn code bekeken hebt
http://www.php.net/empty moet doornemen.
@Niels, dat is 1 van mijn missies...... ik blijf er net zo lang op hameren opdat ze het lef niet meer hebben deze zinlose functie te gebruiken
@Dennis, ik denk dat je dan nog eens heel goed @Niels, dat is 1 van mijn missies...... ik blijf er net zo lang op hameren opdat ze het lef niet meer hebben deze zinlose functie te gebruiken
Het is zinloos dat weet ik ook. Maar om daar nu altijd GVD bij te zeggen vind ik wat te veel van het goede;)
Als jij dan antwoord wil geven of ze iets kunnen met een wachtwoord md5hash + email dan ben ik weer helemaal blij.
Wil alleen weten of het zo veilig genoeg is en of er geen kans is dat iemand een cookie steelt en vervolgens kan inloggen.
Toevoeging op 01/10/2010 23:15:03:
@ Noppes,
Ik heb het bekeken, maar ik begrijp het probleem niet
empty() controleert of een waarde leeg is en == '' toch ook en dat is toch ook wat je wilt bereiken of zit ik helemaal mis?
Waarom zou je empty() nooit meer mogen gebruiken?
en zoals je het gepost hebt is het niet veilig.
Toevoeging op 01/10/2010 23:18:33:
@Dennis, dan moet je nog een keer goed lezen http://www.php.net/empty
emtpy() !== ''
@ Noppes het zou ook helpen als je zou zeggen hoe het dan wel veilig zou kunnen zijn of ligt dit puur eraan omdat ik empty() gebruik en niet == '' ?
session hijacking
Ik zou ook nog dit regeltje toepassen, tijdens het starten van een session. Maakt het wat ingewikkelder om te sidejacken.
session regenerate
Een artikel voor het beveiligen van je website, misschien ben je er wel in geinteresseerd. Ik zou ook nog dit regeltje toepassen, tijdens het starten van een session. Maakt het wat ingewikkelder om te sidejacken.
session regenerate
Gewijzigd op 02/10/2010 03:41:34 door Karizma Yusuf
Het gaat erom dat je een onbekende factor moet hebben voor de buitenwereled om redelijk veilig met cookies/session te werken.
Zie het geposte dd: 01/10/2010 22:29:37
Dan word het dus zo:
Lars Groot op 02/10/2010 13:15:32:
Om te controleren of een variabele leeg is gebruik je GEEN empty(); maar isset();
Dan word het dus zo:
(...)
Dan word het dus zo:
(...)
Nee, zie isset.
Dat klopt dus niet.
Zoals je op php.net kan lezen over empty levert empty true als de variabele:
- "" (an empty string)
- 0 (0 as an integer)
- "0" (0 as a string)
- NULL
- FALSE
- array() (an empty array)
- var $var; (a variable declared, but without a value in a class)
Dus als je wilt dat een variabele die waardes niet mag hebben kan je gerust met empty controleren. Als je dus dan met preg_* en != '' en weet ik veel wat ga prutsen ben je verkeerd bezig, kies dan gewoon voor empty.
Quote:
Dus als je wilt dat een variabele die waardes niet mag hebben kan je gerust met empty controleren. Als je dus dan met preg_* en != '' en weet ik veel wat ga prutsen ben je verkeerd bezig, kies dan gewoon voor empty
Karl, gezien het feit dat je nooit weet welke waarde je door empty haalt gaat jouw verhaaltje dus niet op.
Dus geen empty gebruiken maar gewoon controleren met de juist functies of http://php.net/manual/en/language.operators.comparison.php
Noppes Homeland op 02/10/2010 15:25:16:
Karl, gezien het feit dat je nooit weet welke waarde je door empty haalt gaat jouw verhaaltje dus niet op.
(...)
Quote:
Dus als je wilt dat een variabele die waardes niet mag hebben kan je gerust met empty controleren. Als je dus dan met preg_* en != '' en weet ik veel wat ga prutsen ben je verkeerd bezig, kies dan gewoon voor empty
Karl, gezien het feit dat je nooit weet welke waarde je door empty haalt gaat jouw verhaaltje dus niet op.
(...)
Jij probeert java in php te krijgen? Jij probeert type save te werken?
Wat mij betreft kan je gewoon empty gebruiken als je wilt dat een variabele dus wel of niet een van de boven genoemde zaken is (dus ook 0 en "0"). Die nul is de enige 'probleem-veroorzaker', dus als je die ook gewoon meerekent, is er geen probleem meer.