Verwijderd schreef op woensdag 15 augustus 2007 @ 19:49:
Ik heb meer gelezen over cookies en heb nog een paar vragen.
1. Stel ik maak een cookie aan, moet ik dan een pad aangeven waar hij het saved? Want hoe kan ik kijken of een cookie bestaat? Zoals dit:
PHP:
1
2
3
4
5
| if(isset($_COOKIE['username']) && ($_COOKIE['wachtwoord']) {
// blaat
} |
Nu checkt hij of jij op de pc cookie van de username hebt staan en cookie met je md5-wachtwoord (het wachtwoord van een user is een md5 hash).
Kijkt nu naar 2 cookies (username cookie + wachtwoord cookie) of is het 1 cookie waar hij 2 dingen uit afleest?
Je hebt een verkeerd beeld van PHP als het gaat om cookies. Er wordt niet "op de PC gekeken". Er wordt een HTTP request gedaan. Daarbij "kijkt" je browser/user agent of de request wordt gedaan naar een path waarvoor bepaalde cookies bekend zijn. Als dat het geval is, worden die bij de request meegestuurd met de HTTP headers.
Het loont de moeite om eens te gaan kijken naar wat je browser precies krijgt of verstuurt. Installeer eens Firefox met een extension om HTTP headers te kunnen bekijken in de request en in de response. En dan uiteraard met name naar de Cookie headers kijken. Kennis van HTTP headers is sowieso een must als je dit soort dingen wilt doen.
2. Hoe moet je cookies plaatsen? Ik heb gelezen dat je dat met setcookie() doet, maar ik heb ook ergens anders gelezen dat het een textfile is. Wordt die cookie dan een .txt bestand, zo ja is het dan nog veilig?
Je kunt setcookie() gebruiken om makkelijk een cookie in de HTTP headers van de response mee te sturen. Bij de client wordt vaak een simpel tekstbestandje aangemaakt ja. Wat er ook gebeurt, de client houdt die data bij. Dat zou net zo goed in een sqlite database of een registersleutel kunnen zijn. Wat er bij de client gebeurt is ook niet echt belangrijk. Je moet er maar op vertrouwen dat die client weleens een cookie mee zou kunnen sturen in bepaalde situaties. En je kunt met de cookie path min of meer aangeven wanneer je wilt dat welke cookies worden meegestuurd door de client.
3. Is het veilig om een wachtwoord te plaatsen in een cookie (wat ik dus daarboven liet zien) als het is het beveiligd met md5. De wachtwoorden zitten in de database sowieso als een md5 hash, is het dan nogsteeds veilig om die informatie ook in de cookie te stoppen? Ik zelf denk dat het veilig is aangezien het md5 is en als je erachter wilt komen, moet je het brute forcen. Dus stel dat iemand de cookie hackt/steelt (hoe je dat ook noemt) dan kan hij nog niks met het wachtwoord.
Je kunt dat beter niet doen. Je kunt dan beter het wachtwoord server-side controleren, en een "token" (je session cookie is meestal goed genoeg) geven aan de client, waarmee je verklaart dat de client zich geauthenticifeerd heeft. Als de client dan die token meestuurt, kun je aan de hand daarvan opzoeken om welke user het gaat. Het is onverstandig om een wachtwoord (versleuteld of onversleuteld of ongehashed) op te slaan op een plek waarvan je niet weet of het veilig is (de client-PC).
4. Het principe is dus eigenlijk, als iemand inlogt met user + ww dan stop je beide dingen gewoon in een cookie (hij heeft aangevinkt "hij wilt ingelogd blijven"). Nu zit die informatie in een cookie, en hij verlaat de pagina. Is het dan zo dat als hij die pagina weer opgaat, de site checkt of de cookie bestaat (hoe weet de site welk pad dat is?!) en als hij ziet dat de user + ww overeenkomen, is hij ingelogd.
Ik zou een session token en eventueel een user ID in de cookie stoppen. De user ID alleen als daar een goede reden voor is. Zoals gezegd weet een site niets over waar een client de cookies bewaart.
5. Is het genoeg om alleen de username + ww in een cookie te zetten? eamelink had in zijn post meerdere dingen gezet (geheime zoutje enz) zie hier:
eamelink in "[php] Sessies vs. Cookies"
Wat is noodzakelijk om in een cookie te plaatsen?
In principe is een standaard session ID die PHP voor je genereert veilig genoeg. Alleen als je echt héél erg safe wilt zijn kun je meer "veiligheid" toevoegen door allerlei extra controledingen in een session / session cookie te zetten, en te gaan controleren op bijvoorbeeld IP adres. Eigenlijk is het helemaal niet noodzakelijk om een cookie te gebruiken, maar dat is wel het handigst. Anders zou je in de URL's dat soort gegevens moeten meesturen. Dat is veel minder veilig. Denk er maar eens aan wat er gebeurt als mensen elkaar links gaan sturen met die session ID's erin. Dan zou je sowieso bijvoorbeeld ook op IP moeten checken. Maar dat wil je eigenlijk ook niet als het niet hoeft, in verband met proxies en dergelijke.
6. Stel dat iemand niet uitlogt, en heeft gekozen om ingelogd te blijven, en de pagina gewoon verlaat. Nu staat hij onderaan vb bij "Wie is ingelogd: Pietje". Nu is de cookie er nogsteeds, dus blijft hij nu een jaar lang daar staan? (als de cookie 1 jaar duurt)
Dat ligt eraan. Als zijn client die cookie een jaar blijft meesturen, zou het kunnen. Als je sessions gebruikt, zou de server die session gegevens ook zolang moeten bewaren. Als je die sessies in files in de /tmp directory laat opslaan (de standaard instelling) blijven de sessies geldig zolang die /tmp directory niet wordt opgeruimd. Als je de sessies zelf bijhoudt in een database heb je er betere controle over.
7. Stel dat een cookie word aangemaakt, en iemand zegt dat hij ingelogd wilt blijven. Cookie lengte staat op 1 jaar. Maar de persoon komt niet terug naar de site, zelfde dus als vraag 6, word hij nu nogsteeds altijd als ingelogd bekeken ookal zit hij niet op de site?
Dat ligt eraan wat je wilt dat er gebeurt. Als je sessies bijhoudt in files, zou je kunnen kijken of de last modified tijd niet teveel afwijkt van de huidige tijd. Als je sessies bijhoudt in een database, kun je met een query de oude sessies opruimen. Het is de vraag wat je met die "login informatie" wilt kunnen. Als je wilt dat andere mensen kunnen zien hoeveel mensen er online zijn, moet je dat inderdaad bij gaan houden.
8. Mijn laatste vraag
Stel iemand zegt 'inlogd blijven', en na vb 15 minuten surfen logt hij uit. Moet de cookie dan verwijderd worden, of moet de cookie er blijven bestaan voor als hij later terug komt?
Als iemand ingelogd wilt blijven en de browser sluit, moet hij ingelogd zijn als hij de browser weer opent en een pagina opvraagt. Als iemand op een knop "uitloggen" drukt moet je de sessie en de cookie opruimen.