9.1. fejezet¶
A fejezet anyaga¶
Sütik¶
Az előző fejezetben kimondtuk, hogy egy modern webalkalmazásnak képesnek kell lennie a felhasználó tevékenységeinek nyomonkövetésére. Megismerkedtünk a sessionnel, ami egy szerveroldali technológia volt a menetkövetés megvalósítására. Ebben a részben megnézünk egy kliensoldali megoldást is, a böngészősütik (angolul: cookie-k) használatát.
Valószínűleg mindenki találkozott már azzal az érdekes jelenséggel, hogy amikor nem első alkalommal látogatunk meg egy weboldalt, akkor egy korábbi látogatásunkkal kapcsolatos információk jelenhetnek meg előttünk.
Egy hétköznapi példa - Rendeljünk pizzát!
Tegyük fel, hogy éhesek vagyunk, ezért a kedvenc pizzázónk weboldalán rendelünk magunknak egy pizzát. Pár nappal később szintén elhatározzuk, hogy pizzát szeretnénk rendelni ugyaninnen.
A pizzázó weboldalára visszatérve a következőket tapasztalhatjuk:
- a főoldalon az ajánlatok között megjelenik a pizza, amit korábban rendeltünk, illetve néhány ahhoz hasonló pizza is felajánlásra kerül
- a kiszállítással és számlázással kapcsolatos űrlapon nem kell minden adatot újból megadni, a rendszer "emlékszik" a korábbi rendelésünk során megadott információkra
- a legutóbbi látogatásunk során eszközölt felhasználói beállításainkat (pl. világos helyett sötét téma kiválasztását) szintén eltárolta a weboldal.
Felmerülhet bennünk a kérdés, hogy hogyan is emlékszik a korábbi látogatásunk tevékenységeire a weboldal. Ennek egyszerű magyarázata, hogy a webalkalmazás böngészősütiket használ, amelyek segítségével eltárolja egy korábbi látogatás adatait, műveleteit.
A böngészősütik segítségével kliensoldalon, a böngészőben tárolhatunk el kis mennyiségű adatot, így azt nem kell újból megadni a weboldal egy későbbi felkeresése során.
Mivel a sütik kliensoldalon tárolódnak, ezért a felhasználók egyszerűen elérhetik és manipulálhatják őket. Emiatt fontos, hogy a sütiket NEM SZABAD bizalmas adatok (pl. jelszavak) tárolására használni!
Egy másik fontos probléma, amit érdemes észben tartani, hogy a felhasználó letilthatja a weboldalunkon a sütik használatát. Emiatt a sütik használata mellett célszerű lehet egy alternatív megoldást is kidolgozni.
Sütik működése¶
Az alábbiakban részletesen is megnézzük, hogy hogyan működnek a böngészősütik.
A süti technológia négy komponensből áll:
- egy süti fejléc sorból a HTTP válasz üzenetben
- egy süti fejléc sorból a HTTP kérés üzenetben
- egy süti fájlból a felhasználó rendszerében, amelyet a böngésző menedzsel
- egy szerveroldali adatbázisból.
A teljes folyamat a következőképpen zajlik:
- a kliens egy hagyományos HTTP kérést küld, amit a szerver fogad
- a szerver készít egy egyedi azonosítót a felhasználónak, és egy, az azonosítóval ellátott belépési pontot az adatbázisban
- a szerver egy HTTP válasszal reagál egy kérésre, amely ezúttal tartalmaz egy
Set-cookie: <azonosító>
fejléc sort is - a böngésző megkapja a választ, és a rendszerünkben található süti fájlt kiegészíti egy új sorral, amely tartalmazza a szerver címét és a fejléc sorban található azonosítót
- ezt követően, ha ugyanezen szerver felé indítunk HTTP kérést, akkor a kérésüzenetben megjelenik egy
Cookie: <azonosító>
fejléc sor, aminek köszönhetően a szerver követni tudja a felhasználó aktivitását a weboldalon.
A fent leírt folyamatot az alábbi ábra szemlélteti.
Sütik kezelése PHP-ban¶
Süti létrehozása, elérése¶
PHP-ban a setcookie()
függvénnyel hozhatunk létre böngészősütit. Ennek a fejléce a következőképpen néz ki:
1 2 3 |
|
A paraméterek rendre:
$name
: a süti neve$value
: a süti értéke$expires
: a lejárati idő, ami után a süti törlésre kerül- értékéül általában UNIX időbélyeget adunk meg
- jellemzően a
time()
függvény visszatérési értékéhez (az 1970.01.01. óta eltelt másodpercek számához) hozzáadott másodpercek számával adjuk meg
$path
: a süti elérési útvonala a szerveren$domain
: a tartománynév, amin belül a süti elérhető$secure
: csak a biztonságos HTTPS protokollon keresztül legyen-e továbbítható a süti$httponly
: csak a HTTP protokollon keresztül legyen-e elérhető a süti- ennek köszönhetően a szkriptek (pl. JavaScript) nem férnek hozzá.
A fenti paraméterek közül csak az első, $name
paraméter értékét kötelező megadni, a többi paraméter opcionális. Ha egy meglévő sütit módosítani szeretnénk, akkor ezt a setcookie()
függvény újbóli meghívásával tehetjük meg egyszerűen.
Mivel a sütik a HTTP üzenetek fejlécében közlekednek, ezért itt is fontos, hogy a setcookie()
függvényt bármilyen kimenet (pl. HTML tagek, üres sorok, PHP által generált output) elküldése előtt hívjuk meg, hiszen utólag már nincs lehetőség a fejlécek megadására!
PHP-ban a sütiket a $_COOKIE
szuperglobális tömb segítségével érhetjük el.
Példa: Egy süti segítségével megszámoljuk, hogy egy felhasználó hányszor látogatta meg a weboldalunkat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
Miután megtekintjük a fenti kód kimenetét a böngészőben, minden egyes böngészőablak frissítés után 1-gyel megnő a látogatás számláló értéke.
A böngészőkben lehetőségünk van a weboldal által használt sütik információinak megtekintésére. Például a Google Chrome böngészőben az F12 billentyűvel megnyithatjuk a fejlesztői konzolt, majd az Application
(Alkalmazás) fülre kattintva a Storage
(Tárhely) menüpont alatti Cookies
(Sütik) opciót kiválasztva megtekinthetjük az oldal által használt böngészősütik adatait.
Süti törlése¶
Ha PHP-ban egy meglévő böngészősütit törölni szeretnénk, akkor a setcookie()
függvény meghívásakor a lejárati időt (3. paraméter) egy múltbeli dátumra állítjuk.
Példa: Egy meglévő süti törlése
1 2 3 4 |
|
Gyakorló feladat¶
Feladat
Írj egy egyszerű, 2 lapból álló weboldalt a következő szempontok szerint:
- A
home.php
fájlban hozz létre egy űrlapot, amelyen a felhasználó egy lenyíló lista segítségével kiválaszthatja a weboldal nyelvét! Az űrlap feldolgozásakor a kiválasztott nyelvet tárold el egylang
nevű, 1 napos lejárati idővel rendelkező böngészősütiben! Az űrlap alatt jeleníts meg egy szöveget a sütiben tárolt nyelven (ha a süti nem létezik, akkor alapértelmezett módon angolul)! Ez alá helyezz el egy "Delete cookies" feliratú hivatkozást, amely adelete_lang.php
állományra navigálja a felhasználót! - A
delete_lang.php
fájlban töröld alang
sütit, majd irányítsd vissza a felhasználót ahome.php
oldalra!
Egy lehetséges megoldás
A home.php
fájl:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
A delete_lang.php
fájl:
1 2 3 4 |
|