Cookies
ik probeer een aantal cookies te zetten in mijn loginclass...
Nu kan ik deze cookies wel echo-en in mijn loginfuncties, maar daar buiten niet.
Ik denk dat er iets best heel erg fout gaat, ik heb echt nog nooit cookies gebruikt dus vrij weinig verstand ervan :D
hierbij mijn koekjes:
Weet je zeker dat je al die $row-> dingen kan benaderen?
Je hoeft al die dingen ook niet in een cookie zetten, meestal wordt er een aparte hash (md5 bijvoorbeeld) gemaakt met de user_agent en ip, aangezien cookies nogal fraude gevoellig zijn.
Als je dan gaat kijken naar de inhoud van een cookie, moet die dus gelijk zijn aan wat je eerder had (wat je opslaat in de db).
Nu heb je eigenlijk een session manager.
Edit: Mijn punt is dus dat je cookie's ontzetten makkelijk gekaapt kunnen worden, als je die zooi dan in je cookie's zet en die zijn nodig om ingelogd te zijn, dan ben je slecht bezig.
En je kunt (geloof ik) niet direct zien dat de cookies zijn geset met $_COOKIE.
Zodat mensen niet iedere keer opnieuw hoeven inloggen als ze de site benaderen...
Heb de cookies overigens werkende nu, geen idee hoe, het werkte gewoon ineens xD
Ook een idee hoe ik ze bij het handmatig uitloggen kan weghalen? Als je nu uitlogt, blijf je door de cookies ingelogt :P
Gewijzigd op 01/01/1970 01:00:00 door Timen kut
Voor firefox moet je een of andere plugin installeren geloof ik. Opera kan uitzichzelf al cookie's editten / verwijderen ( rechts klikken op pagina -> Edit site preferences -> Cookies tab).
Hmm, dus eigenlijk stel jij dat je cookies beter niet kunt gebruiken voor het ingelogt houden van een persoon?
setcookie(naam,,time()-1);
Waarom jij dacht dat het niet werkte, komt misschien omdat een cookie pas op te vragen is na een refresh, en is dus niet, zoals bij een sessie, direct te gebruiken.
Wat Karl bedoelt, is dat je geen gevoelige informatie moet opslaan in een cookie, een cookie is niks anders een dan tekstbestandje op de computer van je bezoeker. Die kan je dus aanpassen. Als ik bij jouw cookie, de admin op 1 zet, zou ik dan ingelogd zijn als admin? Dat kon hier op PHPhulp bijvoorbeeld lange tijd wel ^^
Timen schreef op 14.03.2009 10:05:
Hmm, dus eigenlijk stel jij dat je cookies beter niet kunt gebruiken voor het ingelogt houden van een persoon?
Jawel, maar je moet het dus op de juiste manier doen :-). Je moet geen gevoelige info in een cookie zetten, maar een unieke id, die aan de hand van vaste feiten (zoals ip en browser agent) moet genereren.
maar een username en userID is geen gevoelige info, dus dat kan ik gewoon in een cookie stampen...
Zou ik dan niet aan de hand van de cookies die ik heb een query uitvoeren om de admin status te achterhalen, en die dan in een sessie te stampen naast mijn cookies?
Zodat alleen username en userID in een cookie staat, en de admin steeds opnieuw wordt opgehaald en in een sessie wordt gezet.
Karl schreef op 14.03.2009 10:08:
die aan de hand van vaste feiten (zoals ip en browser agent) moet genereren.
Uhm, auw? Sinds wanneer zijn een IP en een UserAgent vast feiten?
Timen schreef op 14.03.2009 10:10:
Oh xD das niet wijs nee...
maar een username en userID is geen gevoelige info, dus dat kan ik gewoon in een cookie stampen...
Zou ik dan niet aan de hand van de cookies die ik heb een query uitvoeren om de admin status te achterhalen, en die dan in een sessie te stampen naast mijn cookies?
Zodat alleen username en userID in een cookie staat, en de admin steeds opnieuw wordt opgehaald en in een sessie wordt gezet.
maar een username en userID is geen gevoelige info, dus dat kan ik gewoon in een cookie stampen...
Zou ik dan niet aan de hand van de cookies die ik heb een query uitvoeren om de admin status te achterhalen, en die dan in een sessie te stampen naast mijn cookies?
Zodat alleen username en userID in een cookie staat, en de admin steeds opnieuw wordt opgehaald en in een sessie wordt gezet.
In feite is een userid ook gevoelige informatie. Als ik nu een willekeurig ID verzin, dan ben ik dus ingelogd als die gebruiker? Gebruikersnaam is er meestal wel bij te zoeken. Sla het op zodat het lijkt als het nutteloze informatie is. Zoals een sha1 van het userid+username+salt. Jij kan dan controlleren of die gegevens bij elkaar kloppen.
edit: Sorry SanThe!
Gewijzigd op 01/01/1970 01:00:00 door Willem Jan Z
WillemJan Z schreef op 14.03.2009 10:10:
Uhm, auw? Sinds wanneer zijn een IP en een UserAgent vast feiten?
Karl schreef op 14.03.2009 10:08:
die aan de hand van vaste feiten (zoals ip en browser agent) moet genereren.
Uhm, auw? Sinds wanneer zijn een IP en een UserAgent vast feiten?
Oke. Die dingen zijn niet helemaal 100% te vertrouwen, maar toch moet je op iets vertrouwen. Natuurlijk is de useragent ook te veranderen, als je het ip wilt veranderen, dan moet je wel wat moeilijker doen.
Alleen een willekeurige gegenereerde id is ook niet te vertrouwen.
Timen, je kunt bijvoorbeeld ook eens kijken hoe bepaalde framworks zoals CakePHP of zend het doen.
verder kan ik bij het inloggen niet mijn cookies achteruit zetten, omdat er dan al headers verstuurd zijn...
Timen schreef op 14.03.2009 10:17:
Dan moet je op het laatst wel belachelijk veel checks uitvoeren om maar te zien of iemand ingelogt is en de boel veilig is >_<
De gebruiker is per definitie niet te vertrouwen, hackers natuurlijk al helemaal niet (naja, je hebt ook white en gray hackers, ik generaliseer effe).
Timen schreef op 14.03.2009 10:17:
verder kan ik bij het inloggen niet mijn cookies achteruit zetten, omdat er dan al headers verstuurd zijn...
Dan moet je zorgen dat je dat doet voordat er data naar de browser is gestuurd.
Die zet ik in een variabel
en voer dan bij alles waar je bij ingelogged moet wezen of die meuk klopt dmv
Code (php)
en de check checkChalk:
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
<?php
function checkChalk($chalk){
if(!empty($chalk)){
$expl = explode('::', $chalk);
$query = "SELECT idmd, usermd, salt
FROM hk_users_DNT
WHERE idmd='".mysql_real_escape_string($expl['0'])."'
AND usermd='".mysql_real_escape_string($expl['1'])."'
AND salt='".mysql_real_escape_string($expl['2'])."'";
$result = mysql_query($query);
if($result){
return true;
}else{
return false;
}
}
}
?>
function checkChalk($chalk){
if(!empty($chalk)){
$expl = explode('::', $chalk);
$query = "SELECT idmd, usermd, salt
FROM hk_users_DNT
WHERE idmd='".mysql_real_escape_string($expl['0'])."'
AND usermd='".mysql_real_escape_string($expl['1'])."'
AND salt='".mysql_real_escape_string($expl['2'])."'";
$result = mysql_query($query);
if($result){
return true;
}else{
return false;
}
}
}
?>
is dit betrouwbaar?
Gewijzigd op 01/01/1970 01:00:00 door Timen kut
Maar je hebt het over de 1e zoveel tekens, maar vervolgens vergelijk je de complete string?
Wat een andere/extra oplossing is, een extra veld in je database met daarin een sleutel. Bijvoorbeeld iets dat verbonden is met de tijd dat iemand ingelogd is. Als je dat in een aparte cookie opslaat en vergelijkt met zijn bezoek, heb je al meer zekerheid dat diegene is ingelogd.
Gewijzigd op 01/01/1970 01:00:00 door Willem Jan Z
het splitsen van :: is inderdaad wel vrij nutteloos achteraf
MySQL heeft ook gewoon functies als SUBSTR hoor :)
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$sql = "SELECT id, userlvl FROM users
WHERE
CONCAT(MD5(SUBSTR(username,0,10)),MD5(SUBSTR(id,0,2)),salt) = '".$_COOKIE['chalk']."';";
?>
$sql = "SELECT id, userlvl FROM users
WHERE
CONCAT(MD5(SUBSTR(username,0,10)),MD5(SUBSTR(id,0,2)),salt) = '".$_COOKIE['chalk']."';";
?>
Deze query zou de md5 van de eerste 10 tekens van de username, de md5 van de eerste 2 tekens van het id en het veld 'salt' vergelijken met de inhoud van je cookie.
edit: Is niet getest btw :P
Gewijzigd op 01/01/1970 01:00:00 door Willem Jan Z
Die heb ik nu zelf al toegepast:P toch bedankt
Timen schreef op 14.03.2009 10:31:
ik heb nu in de DB een md5 op het ID bijgezet(eerste 2 karakters), een md5 van de username(eerste 10 karakters) en een salt (md5 van random 1,10 * random 1,10).
Die zet ik in een variabel
en voer dan bij alles waar je bij ingelogged moet wezen of die meuk klopt dmv
en de check checkChalk:
is dit betrouwbaar?
Die zet ik in een variabel
en voer dan bij alles waar je bij ingelogged moet wezen of die meuk klopt dmv
Code (php)
en de check checkChalk:
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
<?php
function checkChalk($chalk){
if(!empty($chalk)){
$expl = explode('::', $chalk);
$query = "SELECT idmd, usermd, salt
FROM hk_users_DNT
WHERE idmd='".mysql_real_escape_string($expl['0'])."'
AND usermd='".mysql_real_escape_string($expl['1'])."'
AND salt='".mysql_real_escape_string($expl['2'])."'";
$result = mysql_query($query);
if($result){
return true;
}else{
return false;
}
}
}
?>
function checkChalk($chalk){
if(!empty($chalk)){
$expl = explode('::', $chalk);
$query = "SELECT idmd, usermd, salt
FROM hk_users_DNT
WHERE idmd='".mysql_real_escape_string($expl['0'])."'
AND usermd='".mysql_real_escape_string($expl['1'])."'
AND salt='".mysql_real_escape_string($expl['2'])."'";
$result = mysql_query($query);
if($result){
return true;
}else{
return false;
}
}
}
?>
is dit betrouwbaar?
Nee, want je zet weer alles in de cookie's, dus als ik alle je cookie's steel, ben ik ingelogd.
Timen schreef op 14.03.2009 11:39:
Hoe wil jij mijn cookies stelen? Cookies staan toch client side?
Er zijn zoveel mogelijkheden.
Zie Wikipedia.
Timen schreef op 14.03.2009 11:39:
En wat adviseer je dan?
Nou, euh, wat ik al de hele tijd adviseer?