Wat mag je allemaal in een session array zetten?
De waarde dat je in zet, bepaal je dat zelf?
of het moet perse bestaat in de database?
Hieronder een voorbeeld sessie waarin de user_level instaat en deze waarde komt exact overeen met wat in de database is.
Alvast bedankt voor jullie uitleg.
Gewijzigd op 18/12/2020 00:05:14 door Mohamed nvt
Na het sluiten van je browser zal het sessie koekje worden verwijderd.
Ik raad wel aan om zuinig te zijn met je data die je in je sessie zet. Gebruikersnamen en wachtwoorden zijn overbodig.
Bij elk verzoek word die sessie-array ingeladen in het geheugen. Bij standaard-configuraties is dat meestal vanaf een bestand op de harde schijf. Dit kan de nodige vertraging met zich mee brengen, zeker als het om veel data en/of traffic gaat.
Zelfs met een andere session-storage zoals memcached of Redis kan het een aardig wat I/O vragen wat de performance niet ten goede komt.
Al die (kilo/mega)bytes tellen rap op.
De korte uitleg is deze: elke keer als je met een browser een website bezoekt, is het voor de webserver die de site naar de browser stuurt alsof je voor de eerste keer de website bezoekt. Dat noemen ze 'stateless', er wordt niet bijgehouden wat de staat is van het bezoek. De webserver onthoudt standaard niets.
Voor veel websites of onderdelen van websites, zoals media, stijlinformatie of statische scripts is dat genoeg. Maar niet voor alles, zoals bij webwinkels of andere sites waar je moet inloggen. Wanneer de HTML-uitvoer van de webserver moet afhangen van bepaalde omstandigen, moet de 'staat' van het bezoek ergens worden opgeslagen.
Een veel voorkomende situatie is wanneer iemand inlogt op een website. Dan moet PHP ervoor zorgen dat je te zien krijgt dat je bent ingelogd en onder welke naam, en dat moet ergens worden onthouden. Het onthouden doet PHP niet zelf, dat wordt aan de browser overgelaten. PHP stuurt dan een Cookie aan de browser met een sessie ID, met een cryptisch ticketnummer waarmee hij je kan herkennen wanneer je een tweede pagina bezoekt. De sessie ID moet natuurlijk wel goed beveiligd zodat niemand hem kan raden, afluisteren of overnemen. Zodra je tegen PHP vertelt dat je $_SESSION wilt gebruiken, verzorgt PHP aan de hand van het sessie ID automatisch het onthouden, door aan het begin van jouw script de gegevens te laden in $_SESSION, en aan het eind van het script op te slaan. De gegevens in $_SESSION worden opgeslagen als een lange tekenreeks. Het proces van geheugen omzetten naar zo'n tekenreeks noemen ze serialiseren, en het omgekeerde deserialiseren.
$_SESSION is een associatieve array, en je kunt er alles inzetten. De platte data (scalars) zoals getallen en tekenreeksen en andere arrays kan je altijd meteen gebruiken. Eigen gegevenstypen kan je beter eerst zelf omzetten naar een tekenreeks met serialize() en dan pas in $_SESSION zetten. Maar je kunt ook de magische methoden __serialize() en __unserialize() in een object maken, dan worden die gebruikt.
Het is een boel informatie, maar je moet het wel weten wanneer je met sessies gaat werken.
Een paar tips:
- neem alle beveiligingstips van OWASP ter harte. Voor cookies zie:
https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html
- maak de PHP sessieconfiguratie veilig: https://www.php.net/manual/en/session.security.ini.php
- controleer de veiligheid van je webserver via https://www.internet.nl
- informatie over serialiseren: https://www.php.net/manual/en/function.serialize.php
- zet nooit wachtwoorden in een database, gebruik altijd password_hash() en password_verify()
- het kan handig zijn om sessiegegevens in de database op te slaan in plaats van op het bestandssysteem.
zie https://www.php.net/manual/en/session.customhandler.php
- als je meer controle wilt over de invoer en uitvoer naar de database, hoef je niet per se gebruik te maken
van de standaardfuncties in PHP, je kunt het ook zelf schrijven (maar dan moet je wel weten wat je doet!)
- je kunt ook meeliften op sessiemanagement van bestaande raamwerken, zoals Symfony