Där PHP-sessionerna är lagrade. PHP-sessioner under skalpellen
På Internet hittar du tusentals handledning om vad sessioner är för vad de behöver och hur man arbetar med dem. Men tyvärr, efter att ha läst dem, kvarstår många frågor. Enligt min åsikt är det enklaste sättet att räkna ut det i allt för att se hur sessionerna arbetar från insidan. De där. Undersök webbläsare och webbserveringsloggar, liksom se vilka data som sparas på klientsidan och på serverns sida.
Därefter blir många ögonblick mycket tydligare, och själva mekanismen är mer transparent.
Sessionerna kommer att studeras vid följande standardskript:
Det fungerar som följer:
Block 1. Funktionen Session_Start () skapar en ny session eller laster den gamla, med hjälp av den unika PHSESSID-sessionsidentifieraren.
Block 2. Om du lyckades återställa sessionen ökar värdet på $ _session ["Visningar"] av en. Om inte, initialiseras av en.
I teorin, om Cook-support är aktiverat i webbläsaren måste mekanismen fungera och varje gång sidan uppdateras, ökar mätarens värde med en.
Första laddningsskriptet
Begär rubriker
Få / http / 1.1 värd: Firingrange.Lokal Användaragent: Mozilla / 5.0 (Windows NT 5.1; RV: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 Acceptera: Text / HTML, Application / XHTML + XML, Application / XML; q \u003d 0,9, * / *; q \u003d 0,8 Acceptera språk: RU-EN, RU; q \u003d 0,8, EN-US; Q \u003d 0,5, EN; q \u003d 0,3 Acceptera kodning: GZIP, DEFLATE Acceptera-Charset : Windows-1251, UTF-8; q \u003d 0,7, *; q \u003d 0,7 Anslutning: Keep-Alive Cache-Control: Max-Ålder \u003d 0Rubriks svar
Http / 1,1 200 ok Datum: Thu, 29 sep 2011 20:36:15 GMT Server: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 Set-cookie: PHPSESSID \u003d K33En6CCGCIA7125MITJ5TE4U6; väg \u003d / Förfaller: Thu, 19 nov 1981 08:52:00 GMT Cache-Control: No-Store, No-Cache, måste-revalidate, post-check \u003d 0, Pre-check \u003d 0 Pragma: No-cache-innehållslängd: 58 Keep-alive: timeout \u003d 5, max \u003d 100 Anslutning: Keep-alive Innehållstyp: Text / HTMLKommentar
I den ursprungliga begäran har webbläsaren inte identifierat sig på något sätt, så mekanismen sessioner php. Genererade en ny unik sessionidentifierare och beordrade webbläsaren för att skapa en gäng där denna mycket identifierare kommer att lagras.
Sidoserver
Som ett resultat av skriptet på serverns sida skapas SESS_K33EN6CCGCIA7125MITJ5TE4U6 av följande innehåll:
Klientsidan
På klientsidan skapas Cook PHSESSID, där värdet på den unika identifieraren för sessionen är lagrad.
Notera. För pHP-inställningar Som standard är LifeTime of Cook PHPSESSID - tills webbläsaren är stängd. De där. Så snart webbläsaren är stängd, kommer Cook att raderas, och sessionen kommer att förloras i enlighet med detta. Livslängden för cookie PHPSESSID kan ändras genom att variera värdet av session.Cookie_lifetime.
Resultatet av skriptets arbete
Andra lastningsskriptet
Begär rubriker
Få / http / 1.1 värd: Firingrange.local Användaragent: Mozilla / 5.0 (Windows NT 5.1; RV: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 Acceptera: Text / HTML, Applicering / XHTML + XML, Applicering / XML; Q \u003d 0,9, * / *; q \u003d 0,8 Acceptera språk: RU-EN, RU; Q \u003d 0,8, EN-US; Q \u003d 0,5, EN; Q \u003d 0,3 Acceptera kodning: gzip, deflate Acceptera-Charset: Windows-1251, UTF-8; Q \u003d 0,7, *; q \u003d 0,7 Anslutning: Keep-Alive Cookie: PHPSESSID \u003d K33En6CCGCIA7125MITJ5TE4U6 Cache-Control: MAX-AGE \u003d 0Rubriks svar
Http / 1.1 200 OK Datum: Thu, 29 sep 2011 20:49:41 GMT Server: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Förfaller: Thu, 19 nov 1981 08:52:00 GMT Cache-Control: No-Store, No-Cache, Must-revalidate, Post-check \u003d 0, Pre-Check \u003d 0 Pragma: No-Cache Innehållslängd: 58 Keep-Alive: Timeout \u003d 5, Max \u003d 100 Anslutning: Keep-alive Innehållstyp: Text / HTMLKommentar
Webbläsaren skickar en PHPSESSID Cook-webbserver med PHP initierar $ _SESSION-array med värden från SESS_K33En6CCGCIA7125MITJ5TE4U6-filen. Följaktligen utgår i block 2 IF (raka) grenen.
Sidoserver
Som ett resultat av skriptoperationen ändras innehållet i SESS_K33EN6CCGCIA7125MITJ5TE4U6-filen:
Klientsidan
Klienten ändras inte på klienten.
Resultatet av skriptets arbete
Vad kommer härnäst?
Efterföljande nedladdningar på sidan innan du stänger webbläsaren kommer att fungera analogt med hur den andra laddningen av skriptet fungerade.
Därför att Cooks livstid var begränsad till den aktuella sessionen i webbläsaren, sedan efter dess stängning kommer den unika sessionsidentifieraren att gå vilse och vid omstart av processen kommer att gå på en ny.
Du kan dock återgå till den sparade sessionen, om du uttryckligen anger PHSESSID som skriptparametern:
Återgå till sessionen är ganska villkorad, för Som ett resultat av skriptoperationen i det här fallet skapas inte Cook. Serverresponshuvud:
Http / 1.1 200 OK Datum: Thu, 29 sep 2011 21:01:52 GMT Server: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Förfaller: Thu, 19 nov 1981 08:52:00 GMT Cache-Control: No-Store, No-Cache, Must-revalidate, Post-check \u003d 0, Pre-Check \u003d 0 Pragma: No-Cache Innehållslängd: 58 Keep-Alive: Timeout \u003d 5, Max \u003d 100 Anslutning: Keep-alive Innehållstyp: Text / HTML
De där. För att upprätthålla arbetet är det från den här sessionen till alla länkar som ska hänföras till? PHPSESSID \u003d K33En6CCGCIA7125MITJ5TE4U6.
Notera. Du kan ange php så att den unika sessionsidentifieraren endast överförs via kocken. För att göra detta, installera session.use_only_cookies i värde 1. I det här fallet kommer tricket, som visat sig inte att passera.
Om cookies är inaktiverade i webbläsaren, kan du sända sessions-id via parametrarna, som vi gjorde ovan. Dessutom finns det en mekanism i PHP som kommer att lägga till den önskade parametern till länken och tillsätt dolda fält i formen. Principen om operation är exakt densamma som med cookies, så vi kommer inte att demontera detta fall separat.
Små frågeformulär (FAQ)
Var lagras sessionsdata fysiskt?
Sessiondata lagras på servern. Som standard registreras de i filer, men du kan ange din egen session datalagringsmekanism (till exempel med hjälp av en databas). Om du vill ha detaljer, se session_set_save_handler-funktionen.
Vem genererar en unik sessionidentifierare?
En unik sessionidentifierare (PHPSESSID) genererar en server.
Är det möjligt att skriva din egen mekanism för sessioner?
Ja, det är ganska möjligt. Som du kan se, använder PHP inte något övernaturligt - Identifieraren sparas mellan förfrågningar med Cook, sessionsdata lagras i filerna på servern.
Till exempel är den egna mekanismen för att arbeta med sessioner i den populära ramkodignitern.
Hur säker är sessionsmekanismen?
Sessionen identifieras endast med hjälp av en unik sessionidentifierare, så i det allmänna fallet är angriparen tillräckligt för att stjäla den för att förvirra servern. Ta testskriptet som vi använde ovan. Om överklagandet till det är från en annan IP (med avseende på den session du skapade), men PHSESSID kommer att överföras densamma, kommer sessionen att återställas och räknaren ökar från det tidigare sparade värdet.
Ge ytterligare skydd kommer att ha dig själv. Till exempel:
- Du kan spara i data från IP-sessionen och användaragenten klienten (kommer att lagras på serverns sida), och sedan vid varje handtag är det nödvändigt att verifiera att de nuvarande värdena sammanföll med de sparade. I det här fallet måste du leta efter en kompromiss mellan användarens säkerhet och bekvämlighet.
Till exempel, om användaren har en dynamisk IP och du använder sessionen för att behålla behörighet, men samtidigt kontrollera navigeringen av den IP, måste användaren komma in i användarnamnet och lösenordet igen.
På samma sätt kan användaragentsträngen variera när du uppdaterar webbläsarens version eller när du installerar några plugins.
- En av de rekommenderade sessionsskyddsmekanismerna är att re-generera en identifierare varje gång skriptet tilltalar (se session_regenerate_id-funktionen). Visa skriptet och arbetsalgoritmen i avsnittet kan vara nedan.
Notera.Om du tror att diskussionen på den officiella hemsidan, då när det ska generera en identifierare, kan problem uppstå med parallell tillgång till data.
Arbetssessioner med återgivande identifierare i sammanhanget
Manus
// block 1.
session_start ();
om(isset.($ _Session ["initierad"]))
session_regenerate_id ();
aNNAN.
$ _Session ["initierad"] \u003d sann.;
// block 2.
om(isset.($ _Session ["Visningar"]))
$ _Session ["Visningar"] ++;
aNNAN.
$ _Session ["Visningar"] \u003d 1;
// block 3.
eko."
<
body>
Antal visningar: ". $ _Session [" Visningar "]."