login  Naam:   Wachtwoord: 
Registreer je!
 Nota's op tutorial:

Tutorials > PHP > Sessies in PHP
Pagina:

Reacties op de tutorial Sessies in PHP


Offline  Thomas
Gepost op: 03 oktober 2004 - 16:54
Moderator

Om ervoor te zorgen dat er geen SID in je URL staat doe je het volgende:

Gebruik de volgende instellingen in alle pagina's waarin je sessies gebruikt en stel deze in VOORDAT je je sessie start:

  1. ini_set("session.use_trans_sid", "0");

betekenis: geeft aan of het doorgeven van sessie-id's via de URL wordt ondersteund (default = 0)

  1. ini_set("url_rewriter.tags", "");

betekenis: geeft aan welke HTML tags herschreven moeten worden (aan welke tags er een sessie-id toegevoegd moet worden) als transparent sessie id support aan staat. Die heb je hierboven al uitgezet, dus dit zou je niet hoeven te gebruiken, ik heb wel een situatie meegemaakt waarin ik deze naast use_trans_sid moest gebruiken, omdat die het om een of andere reden niet deed (default "a=href,area=href,frame=src,input=src,form=fakeentry,fieldset=")

  1. ini_set("session.use_cookies", "1");

betekenis: geeft aan of de client een cookie dient te gebruiken om hier het sessie-id in op te slaan (default 1)

  1. ini_set("session.use_only_cookies", "1")

(vanaf PHP v4.3.0)
betekenis: geeft aan of de client enkel cookies dient te gebruiken om het sessie-id op te slaan (default 0)

Deze ini_sets gezamenlijk zouden moeten garanderen dat er geen SID meer in je URL voorkomt.

Offline  Thomas
Gepost op: 14 november 2004 - 20:37
Moderator

Wanneer je je sessie gebruikt om formulierwaarden tijdelijk op te slaan, en je wilt na afloop de sessie weer "schoonmaken", met uitzondering van je standaard sessie-variabelen, dan kun je de volgende functie gebruiken:

  1. <?php
  2. // schoont het array $arr op, met uizondering van de keys in $exclude
  3. /*
  4. parameter: $arr (array) het array dat opgeschoond dient te worden
  5. parameter: $exclude (array) de variabelen die ongemoeid moeten blijven
  6. post: Het array $arr is opgeschoond (ge-unset), met uitzondering van de keys die voorkomen in $exclude
  7. returns: (array) een array met de keys van de verwijderde items
  8.  
  9. Gebruik, om formuliervariabelen uit je sessie te verwijderen:
  10. cleanup($_SESSION, array("loggedIn", "id", "user"));
  11. Deze laat de sessie-variabelen "loggedIn", "id" en "user" ongemoeid
  12. */
  13. function cleanup(&$arr, $exclude) {
  14. $removed = array();
  15.  
  16. foreach($arr as $k => $v) {
  17. if(!in_array($k, $exclude)) {
  18. unset($arr[$k]);
  19. $removed[] = $k;
  20. }
  21. }
  22. return $removed;
  23. }
  24. ?>


Wat je natuurlijk ook kunt doen, is alle formuliervariabelen in een array in je sessie stoppen (bijvoorbeeld formvars()). Je kunt dan volstaan met:

  1. <?php
  2. unset($_SESSION['formvars']);
  3. ?>

Offline  Legolas
Gepost op: 02 april 2005 - 17:29
Onbekend

Ik vind eigenlijk dat een klein dingetje mist, een verloopdatum instellen van een sessie. bijvoorbeeld:
  1. session.cookielifetime = 3600 // onthoud sessie 1 uur

Verder perfect. 4,5

Offline  Thomas
Gepost op: 03 april 2005 - 12:32
Moderator

Dat is de houdbaarheidsduur van het cookie dat verwijst naar de sessie.

Ik vraag me af wat er gebeurt als je langer dan session.gc_maxlifetime seconden wacht dan.

Je hebt dan nog wel een verwijzing naar je sessie (via je cookie) maar je sessie zelf is verlopen...

EDIT: ik heb nog even het een en ander zitten proberen (op zowel een Windows- als een LINUX-webserver), en hier kwam het volgende uit:

Op een Windows-webserver (althans de mijne) wordt de verlooptijd van het cookie genaamd "PHPSESSID" NIET geupdate als je de pagina refreshed (wat je misschien wel zou verwachten).

Als je dus om 16:37:19 een sessie start, en session.cookie_lifetime staat ingesteld op 3600 (seconden), dan loopt je sessie hoe dan ook om 17:37:19 af.

Maar je moet nog met iets anders rekening houden, namelijk session.gc_maxlifetime (default 1440 seconden = 24 minuten) en session.gc_probability (default 1) en session.gc_divisor (default 100).

Na gc_maxlifetime seconden inactiviteit wordt het sessie-bestand als "afval" beschouwd en is er een kans van gc_probability / gc_divisor % (default 1% dus) dat de sessie wordt opgeruimd.

Hier komt ook nog eens bij dat windows geen ACCESS-tijden bijhoudt, alleen maar MODIFICATION-tijden (dus datum+tijd wanneer een bestand van inhoud verandert). Omdat de sessie-inhoud niet noodzakelijkerwijs wordt veranderd als een pagina waarbij van sessies gebruik gemaakt wordt wordt opgevraagd, heb je hier dus nog een probleem op een Windows-webserver (zie de toelichting op PHP.net) - sessies zouden dus op Windows-servers op een gegeven moment ten onrechte als "afval" gezien kunnen worden als ik het allemaal goed begrijp.

Op een webserver op een UNIX-systeem schijnt de verlooptijd van een cookie wel geupdate te worden als je een pagina opvraagt die gebruik maakt van een cookie-based sessie.

Een sessie houdt dus zeker op met bestaan als de tijd van laatste pagina access + cookie_lifetime is verstreken zonder dat de pagina is ververst, maar al veel eerder (na 1440 seconden of 24 minuten) bestaat de kans (default 1%) dat je sessie wordt opgeruimd.

In het interval 24-60 minuten inactiviteit bestaat dus al de kans dat je sessie weg is, session.cookie_lifetime zegt dus niet alles !!!

Offline  nathanael
Gepost op: 08 juni 2005 - 20:32
Gouden medaille

HTML gevorderde


Bij paragraaf 9, heb je een link staan naar een verouderde versie van je script, en werkt dus niet... 

Offline  Thomas
Gepost op: 01 oktober 2015 - 12:13
Moderator

Een niet heel onbelangrijke toevoeging: het doel van sessies is dus in wezen het (op een veilige manier) onthouden van gegevens over meerdere pagina's van een website.

HTTP is stateless, dat wil zeggen: houdt geen historie bij van wat het voorheen deed. Als je op een website van pagina A naar pagina B navigeert, weet je op pagina B in principe niet meer dat je van A afkomstig bent.

Om dus bijvoorbeeld te onthouden dat je op enig moment succesvol bent ingelogd (en je daarmee toegang krijgt tot andere content en functionaliteit) zul je dit op een andere manier moeten onthouden (cookie of sessie).

---

Voor het volledig (handmatig) afsluiten van een sessie dient ook het sessie cookie verwijderd te worden, het afsluiten van een sessie moet dus eigenlijk als volgt:

  1. <?php
  2. // @see php.net/session_destroy
  3. // Empty $_SESSION.
  4. $_SESSION = array();
  5.  
  6. // Do not close the session as this will make it readonly, preventing the physical file from being deleted.
  7.  
  8. // Delete session cookie.
  9. if (ini_get('session.use_cookies')) {
  10. '',
  11. time() - 42000,
  12. $params['path'],
  13. $params['domain'],
  14. $params['secure'],
  15. $params['httponly']
  16. );
  17. }
  18.  
  19. // Destroy the session.
  20. ?>

---

Naast ini_set() kun je ook met de volgende functie het session_path instellen:

  1. <?php
  2. session_save_path('/pad/naar/sessie/dir');
  3. ?>

Zorg ervoor dat dit pad buiten je webdirectory valt.

Met name bij shared hosting loont het de moeite om handmatig een pad in te stellen omdat je anders mogelijk het sessiepad deelt met andere gebruikers. Dit is tevens een reden om voorzichtig om te springen met de data die je in een sessie zet. Zo is het namelijk helemaal niet nodig om hier al je gebruikers-data (zoals een wachtwoord) in te dumpen.

Pagina:

Enkel aanvullende informatie is welkom. Geen prijzende of afkeurende reacties.
 
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.101s