Laden…

PHP sessie verlengen

Als je op een website gebruikt maakt van authenticatie (inloggen) wil je controle hebben op de duur van de beveiligde sessie die is ontstaan tussen de browser en de webserver. PHP maakt hierbij gebruik van wat ze noemen “Sessions”.

Een sessie bestaat uit twee componenten:

  • Bestand op de webserver waarin de sessie informatie wordt opgeslagen. (Dit kan ook in een database opgeslagen worden);
  • Cookie op de browser waarin het sessie id wordt bewaard. (Kan ook een parameter zijn in de URL maar dit wordt beschouwd als minder veilig).

Beide componenten moeten in overeenstemming zijn om een geldige sessie te hebben. De gebruiker hoeft dan bijvoorbeeld niet op nieuw zijn inloggegevens in te voeren maar gaat direct door naar zijn beveiligde omgeving. Mocht er geen geldige sessie gevonden worden dan moet er opnieuw ingelogd worden om een nieuwe sessie op te bouwen.

Om gebruik te maken van sessies in PHP moet je in elke op te vragen pagina (script) het commando session_start() gebruiken. PHP gaat zoeken naar een phpsessid cookie. Als die niet gevonden wordt wordt er een nieuw sessie bestand aangemaakt op de webserver en een nieuw sessie cookie aangemaakt in de browser en beide worden aan elkaar gekoppeld met behulp van het sessie id.

Bij een nieuw webverzoek wordt er telkens gekeken of er een geldige sessie aanwezig is. Webverzoeken ontstaan doordat de je een pagina ververst of omdat je op de website aan het bladeren (klikken) bent.

Standaard is een PHP sessie 1440 seconden geldig. 1440/60=24 minuten. De lengte van de sessie wordt bepaald in de php.ini door twee instellingen:

  • session.cookie_lifetime: Hiermee wordt de verlooptijd van de cookie ingesteld in seconden. Standaard staat deze waarde op 0 wat inhoud dat de cookie pas verloopt als de browser wordt herstart;
  • session.gc_maxlifetime: De maximale leeftijd van het sessiebestand op de webserver voordat het opruim proces het sessie bestand mag identificeren als ‘op te ruimen kandidaat’. 

Door beide instellingen worden zowel aan de browserkant als aan de webserverkant gewerkt aan het opruimen of geldig zijn van de sessie. De browserkant is in principe hard. Is de tijd verlopen dan wordt er om een nieuwe sessie gevraagd. In principe hard omdat een cookie gemanipuleerd kan worden waardoor de sessie constant verlengd zou kunnen worden. De webserver kant is echter niet zo hard. Hier draait af en toe een opruim proces die de aangemerkte kandidaten gaat opruimen. Het opruim proces draait dus niet continue. Dat zou te veel resources vreten op een webserver. Daarom zijn er nog twee instellingen die op de webserver samen het opruimen van een sessie bestand veroorzaken: session.gc_probability en session.gc_divisor. Beide instellingen berekenen een kans of het opruim proces moet gaan draaien. Samen kunnen ze berekenen dat er bijvoorbeeld 1% kans is om het opruim proces te draaien. Dat lijkt laag maar vergeet niet dat een webserver heel druk kan zijn en dat er duizenden zo niet tienduizenden verzoeken binnenkomen.

Je kunt afzien van deze zachte kansberekening en het opruimproces hard maken door bijvoorbeeld een cron job te laten starten op gezette tijden om de opruiming te starten. Bijvoorbeeld elk uur of elke 24 uur.

Hoe dan ook geven alle bovenstaande parameters geen 100% garantie dat een sessie ook direct op de verlooptijd vernietigd wordt maar je komt flink in de buurt. Om de sessie verlooptijd te verlengen pas je beide parameters aan naar een waarde in seconden. Stel je wilt naar 30 minuten dan stel je beide parameters in php.ini als volgt in:

session.cookie_lifetime = 1800
session.gc_maxlifetime = 1800