Beste PHPisten,

Gedurende de tijd dat de user op mijn website komt, verzamel ik heel wat info die via POST, GET en uit de database gehaald wordt.
Ik sla deze info systematisch op in $_SESSION, zodat ik bijvoorbeeld de naam van de user 27 pagina's verder nog steeds ken.
Is dit een goede manier van werken? Zijn er valkuilen waar ik op moet letten? Alle tips zijn welkom.

Sam
Heey Sam,

Ja het gebruik van sessies voor dit type is een goede manier. Echter let er wel op dat je geen gebruikersgevoelige informatie erin zet. Zo raad ik het niet aan om de volgende punten erin te zetten.

- volledige naam
- email adres
- wachtwoorden
- NAW gegevens
- en andere gevoelige informatie

Ook is het slim om mensen een zogehete 'screenname' te geven. Dat i.p.v. van hun inlog/username een screenname meegegeven wordt. Dit maakt het stukken veiliger aangezien ze dan ook geen username hebben om een dictionary attack op uit te voeren bijvoorbeeld.
Waarom geen gebruikersgevoelige info? Zijn er manieren om de sessie-waarden uit te lezen door boosdoeners?
Hoe wil je met en screenname werken als je bijvoorbeeld een bericht van 'Sam Witse' op een pagina wil afbeelden. Ergens wil ik dan 'Sam Witse' bijhouden, zodat ik bij de opboew van mijn pagina gewoon $_SESSION["Username"] kan gebruiken?
Ja sessies zijn te 'hijacken', wat inhoud dat hackers meeliften op jou sessie ID en zo gegevens kunnen misbruiken. Vandaar de reden om nooit dit type informatie in een sessie te zetten.

Ik neem aan dat als je een 'post' maakt je het ID van de gebruiker erbij zet in je database? Dan kun je namelijk zien wie het gepost heeft, en met een JOIN kun je dus bijvoorbeeld uit het tabel posts de titel en omschrijven halen en uit de tabel users de screenname.

Je kunt $_SESSION['username'] niet gebruiken om direct in het scherm een post te koppelen aan een gebruiker, dit doe je in de database door de user-id in de post entry te zetten.

Als je bijv jou optie zou gebruiken hier zou jou naam bij elke reply komen. Een sessie is namelijk 'user' gebonden, wat betekent dat elke bezoeker een eigen sessie met sessie ID heeft. Als jij dan voor een post $_SESSION['username'] afdrukt staat voor elke post jou username.

Je kunt $_SESSION['username'] bijvoorbeeld wel gebruiken om te laten zien onder welk account iemand ingelogd, zoals hier bij Ingelogd als: Sam Witse.

Dus blijvoorbeeld

<p>Ingelogd als: <?php echo $_SESSION['username']; ?></p>

zou je Ingelogd als: Sam Witse krijgen.
Sorry, het was een slecht voorbeeldje van mij.

Maar een $_SESSION['username'] bijhouden om telkens de naam van de account af te beelden, raad je dus af?

Beter een $_SESSION['userid'] bijhouden, en telkens ik de naam van de account wil afbeelden, het user-record ophalen uit de database?
Volgens mij kun je de screen name best in een sessie bijhouden, maar ik zou bijv. geen gevoelige info in een sessie opslaan, dus geen adresgegevens, loginnaam, wachtwoord, creditcard nummer e.d.
Sam,

Nee mensen gebruiken een 'username' om in te loggen hier bij PHPhulp is dat je emailadres. Echter staat onder je avatar Sam Witse A.K.A je screenname.

Dit is niets meer als een naam die de gebruiker verzint en weergegeven wordt op de site. Hackers hebben daar dan ook niets aan, je gebruikt een screenname immers niet om mee in te loggen.

Even een onderscheid tussen de twee hieronder.

Username: [email protected] - log je mee in via het login scherm
sceenname: Henkske - wordt afgebeeld bij posts, ingelogd als:, etc.

Een userid zijn over het algemeen de unieke nummers die MySQL automatisch ophoogt bij het aanmaken van nieuwe gebruikers, is dus niet echt herkenbaar wie wie is met het blote oog.
Ik snap het.
Maar als ik 'gevoelige' info wil gebruiken, dan mag ik die enkel maar halen als ik een pagina opbouw waar is ik die info wil tonen, bijvoorbeeld in een pagina waar een user zijn account-gegevens kan zien en wijzigen? En om om die info op te halen uit de database, gebruik ik best de primary key, die ik opgehaald heb op het ogenblik dat de user inlogt.
Zo goed?
Je mag alles, maar het is niet aan te raden.

Inderdaad als je dus op de pagina 'gebruikersinstellingen' komt draai je daar een query die de gegevens uit de database haalt. Die kun je dan zo laten zien

<html>
<input type="text" name"voornaam" value"<?php echo $row['voornaam']; ?>">
</html>

of

<html>
<input type="text" name"voornaam" value"<?php echo $row['1']; ?>">
</html>

als je weet dat het tweede (0 is het eerste veld) veld in je database voornaam is.

Je kunt de gegevens ook ophalen vanuit de 'screenname' als je wil, de primay key (id) is niet perse nodig.
Klaar als een klontje!
Allen bedankt!

Sam.
Graag gedaan, succes!

Reageren