Ahol a PHP üléseket tárolják. PHP ülések a szike alatt
Az interneten több ezer oktatóanyagot találhat arról, hogy milyen ülésekre van szükségük, és hogyan kell dolgozni velük. De sajnos, miután elolvasta őket, sok kérdés marad. Véleményem szerint a legegyszerűbb módja annak, hogy kitaláljuk, hogy mindenben megnézzük, hogyan működik az ülések belülről. Azok. Vizsgálja meg a böngésző és a webszerver megosztása naplókat, valamint nézze meg, hogy milyen adatok mentésre kerülnek az ügyfél oldalán és a szerver oldalán.
Ezután sok pillanat sokkal világosabbá válik, és maga a mechanizmus átláthatóbb.
Az üléseket a következő szabványos szkripten fogják tanulmányozni:
Az alábbiak szerint működik:
1. blokk. A Session_Start () funkció új munkamenetet hoz létre, vagy betölti a régi, az egyedülálló PHSESSID munkamenet azonosító használatával.
2. blokk. Ha sikerült visszaállítja az üléseket, a $ _session ["Nézetek"] értéke egyre nő. Ha nem, az inicializálja.
Elméletileg, ha a Cook Support engedélyezve van a böngészőben, a mechanizmusnak meg kell működnie, és minden alkalommal, amikor az oldal frissül, a mérő értéke növekszik.
Első betöltési parancsfájl
Kérjen fejléceket
Get / http / 1.1 Host: SellingRange.Local Felhasználói ügynök: Mozilla / 5.0 (Windows NT 5.1, RV: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 Elfogadás: Szöveg / HTML, Alkalmazás / XHTML + XML, Alkalmazás / Xml; q \u003d 0,9, * / *; q \u003d 0,8 Elfogadás-nyelv: ru-en, ru, q \u003d 0,8, en-us; q \u003d 0,5, en; q \u003d 0,3, EN; q \u003d 0,3 Elfogadás-kódolás: gzip, deflálja az elfogadás-karját : Windows-1251, UTF-8; q \u003d 0,7, *; q \u003d 0.7 Csatlakoztatás: tartás-életben cache-control: max-kor \u003d 0Fejlécek Válasz
Http / 1.1 200 ok Dátum: Thu, 29 szept. 2011 20:36:15 GMT Szerver: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-POWERED-BY: PHP / 5.2.10 SET-Cookie: PHPSSESSID \u003d K33EN6CCGCIA7125MITJ5TE4U6; PATH \u003d / Lejár: Thu, 1981 november 08:52:00 GMT Cache-Control: No-Store, No-Cache, Must-Revidate, Post-Check \u003d 0, Pre-Check \u003d 0 PRAGMA: NO-Cache Content-Hossz: 58 Keep-Alive: Timeout \u003d 5, max \u003d 100 Csatlakozás: tartandó tartalom típus: szöveg / htmlMegjegyzés
A kezdeti kérelemben a böngésző semmilyen módon nem azonosította magát, így a mechanizmust sessions PHP. Új egyedi munkamenet-azonosítót generált, és parancsolta a böngészőt, hogy olyan csomópontot hozzon létre, amelyen ez a nagyon azonosító tárolódik.
Oldalsó szerver
A szerver oldalán lévő szkript eredményeként létrejön a Sess_k33en6CCGCIA7125MITJ5TE4U6 a következő tartalom:
Ügyfél oldal
Az ügyféloldalon a Cook Phpsessid létrehozása, amelyben a munkamenet egyedi azonosítójának értéke tárolódik.
Jegyzet. -Ért pHP beállítások Alapértelmezés szerint a Cook Phpsessid élettartama - amíg a böngésző zárva van. Azok. Amint a böngésző zárva van, a Cook törlődik, és az ülés elvesztése ennek megfelelően elvész. A Cookie Phpsessid élettartama megváltoztatható a session.cookie_lifetime értékének változtatásával.
A szkript munkájának eredménye
Második betöltési forgatókönyv
Kérjen fejléceket
Get / http / 1.1 Host: SellingRange.Local Felhasználói ügynök: Mozilla / 5.0 (Windows NT 5.1, RV: 6.0.2) GECKO / 20100101 Firefox / 6.0.2 Elfogadás: Szöveg / HTML, ALKALMAZÁS / XHTML + XML, ALKALMAZÁS / XML, Q \u003d 0,9, * / *; q \u003d 0,8 Elfogadás-nyelv: ru-en, ru; q \u003d 0,8, en-us; q \u003d 0,5, en; q \u003d 0,3 Elfogadás-kódolás: GZIP, Deflate Elfogadási-Charset: Windows-1251, UTF-8; q \u003d 0,7, *; q \u003d 0,7 Csatlakozás: Keep-Alive Cookie: PHPSSESSID \u003d K33EN6CGCIA7125MITJ5TE4U6 Cache-Control: Max-Age \u003d 0Fejlécek Válasz
Http / 1.1 200 OK dátum: Thu, 29 szept. 2011 20:49:41 GMT szerver: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 lejár: Thu, 19 nov 1981 081:52:00 GMT Cache-Control: No-Store, No-Cache, Must-Revidate, Post-Check \u003d 0, Pre-Check \u003d 0 Pragma: No-Cache Content-Length: 58 tartás-életben: Timeout \u003d 5, max \u003d 100 Csatlakozás: tartandó tartalom típus: szöveg / htmlMegjegyzés
A böngésző PHPSSESSID COCE WEB SERVER-t küld a PHP használatával a Sess_k33en6CCGCIA7125MITJ5TE4U6 fájl értékeitől. Ennek megfelelően a 2. blokkban működik az IF (egyenes) ágon.
Oldalsó szerver
A szkript művelet eredményeként a Sess_k33en6CCGCIA7125MITJ5TE4U6 fájl tartalma megváltozik:
Ügyfél oldal
Az ügyfél nem változik az ügyfélen.
A szkript munkájának eredménye
Mi a következő lépés?
A böngésző lezárása előtt az oldal későbbi letöltése analógiával fog működni azzal, hogy a szkript második terhelése hogyan működött.
Mivel A Cook élettartama a böngésző aktuális munkamenetére korlátozódott, majd a bezárása után az egyedülálló munkamenet azonosítója elveszik, és az újraindításkor a folyamat új lesz.
Azonban visszatérhet a mentett munkamenethez, ha kifejezetten megadja a Phsessid parancsot a parancsfájl paraméterként:
A munkamenethez való visszatérés meglehetősen feltételes, mert Ebben az esetben a szkript művelet eredményeképpen a szakács nem jön létre. Szerver válasz fejlécek:
Http / 1.1 200 OK dátum: Thu, 29 szept. 2011 21:01:52 GMT Server: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 lejár: Thu, 19 nov 1981 081:52:00 GMT Cache-Control: No-Store, No-Cache, Must-Revidate, Post-Check \u003d 0, Pre-Check \u003d 0 Pragma: No-Cache Content-Length: 58 tartás-életben: Timeout \u003d 5, max \u003d 100 Csatlakozás: tartandó tartalom típus: szöveg / html
Azok. A munka fenntartása érdekében ez a munkamenet minden olyan linkre vonatkozik, amely a PHPSSESSID \u003d K33EN6CCGCIA7125MITJ5TE4U6.
Jegyzet. Megadhatja a PHP-t úgy, hogy az egyedülálló munkamenet-azonosítót csak a szakácson keresztül továbbítják. Ehhez telepítse a session.use_only_cookies értéket. 1. Ebben az esetben a fent bemutatott trükk nem fog kerülni.
Ha a cookie-k le vannak tiltva a böngészőben, akkor a munkamenet-azonosítót a paramétereken keresztül továbbíthatja, ahogy fent tettünk. Ezenkívül van egy mechanizmus a PHP-ben, amely hozzáadja a kívánt paramétert a linkre, és rejtett mezőket ad hozzá az űrlapba. A működés elve pontosan ugyanaz, mint a cookie-k, ezért nem szétszereljük ezt az esetet külön-külön.
Kis kérdőív (GYIK)
Hol van a munkamenet adatai fizikailag tárolva?
A Session adatok a kiszolgálón vannak tárolva. Alapértelmezés szerint fájlok vannak rögzítve, de megadhatja saját munkamenet adattároló mechanizmusait (például egy adatbázis használatával). Ha részleteket szeretne, olvassa el a session_set_save_handler funkciót.
Ki hoz létre egyedülálló munkamenet-azonosítót?
Egyedi munkamenet-azonosító (PHPSSESSID) kiszolgálót generál.
Lehet-e írni a saját munkamenetek mechanizmusait?
Igen, meglehetősen lehetséges. Amint látja, a PHP nem használ semmit természetfeletti - Az azonosítót a szakács kérelmei között tárolják, az ülés adatai a szerveren található fájlokban vannak tárolva.
Például az ülésekkel való munkavégzés saját mechanizmusa a Népszerű Kódexkönyvben található.
Mennyire biztonságos az ülések mechanizmusa?
A munkamenet csak egy egyedi munkamenet-azonosító segítségével azonosítható, így az általános esetben a támadó elég ahhoz, hogy ellopja a kiszolgálót. Vegye ki a fent használt teszt szkriptet. Ha a fellebbezés egy másik IP-től (a létrehozott munkamenethez képest), de a Phsessid ugyanazt fogja továbbítani, akkor a munkamenet sikeresen visszaáll, és a számláló növekszik az előző mentett értékről.
További védelmet nyújt Önnek. Például:
- Megtakaríthatja az IP-munkamenet és a felhasználói ügynök ügyfél adatait (a kiszolgáló oldalán tárolva), majd minden egyes fogantyúnál ellenőrizni kell, hogy az aktuális értékek egybeesnek-e a mentett. Ebben az esetben meg kell keresnie a kompromisszumot a felhasználó biztonságának és kényelmének között.
Például, ha a felhasználónak dinamikus IP-je van, és a munkamenetet az engedély megőrzéséhez használja, de ugyanakkor ellenőrizze az IP navigációját, majd minden címváltozást, a felhasználónak újra kell írnia a felhasználónevet és a jelszót.
Hasonlóképpen, a felhasználói ügynök karakterlánc a böngésző verziójának frissítése vagy néhány plugin telepítésekor változhat.
- Az ajánlott munkamenet-védelmi mechanizmusok egyike az azonosító újbóli létrehozása minden alkalommal, amikor a szkript felkéri (lásd a Session_Regenerate_ID funkciót). A szkript megtekintése és a szakterület munkálási algoritmusa lehet.
Jegyzet.Ha úgy gondolja, hogy a hivatalos honlapon folytatott vita, akkor az azonosító újbóli létrehozásakor a problémák párhuzamos hozzáféréssel merülhetnek fel.
Munkamenetek, amelyek újraindításával azonosítóval rendelkeznek
Forgatókönyv
// blokk 1.
session_start ();
ha.(.($ _Session ["kezdeményezett"]))
session_regenerate_id ();
mÁS.
$ _Session ["kezdeményezett"] \u003d igaz.;
// blokk 2.
ha.(.($ _Session ["Nézetek"]))
$ _Session ["Nézetek"] ++;
mÁS.
$ _Session ["Nézetek"] \u003d 1;
// 3 blokk.
visszhang."
<
body>
Megtekintések száma: "$ _session [" Nézetek "]."