Odjava uporabnika pomeni, da v aplikaciji zaključimo njegovo prijavljeno sejo. S tem uporabniku onemogočimo nadaljnji dostop do zaščitenih strani, dokler se znova ne prijavi.
Odjava je pomemben del varnosti spletne aplikacije. Pri prijavi v sejo shranimo podatke, s katerimi aplikacija prepozna prijavljenega uporabnika. Pri odjavi moramo te podatke odstraniti in sejo zaključiti.
Pomni: Odjava je povezana predvsem s sejo, ne s podatkovno bazo. Tudi če je bila prijava izvedena z MySQL poizvedbo, se pri odjavi običajno ukvarjamo predvsem s podatki v $_SESSION.
Pred brisanjem ali spreminjanjem podatkov seje moramo najprej uporabiti session_start(), saj PHP šele takrat odpre trenutno sejo.
Vsebina strani
Osnovna pravila
Pri odjavi moramo odstraniti podatke, ki označujejo prijavljenega uporabnika. Če tega ne naredimo pravilno, lahko uporabnik ali druga oseba na isti napravi še vedno dostopa do zaščitenih strani.
- Najprej zaženemo sejo s funkcijo
session_start(). - Odstranimo podatke o prijavi iz
$_SESSION. - Po potrebi počistimo vse preostale podatke seje.
- Sejo zaključimo s funkcijo
session_destroy(). - Uporabnika preusmerimo na prijavno ali začetno stran.
- Po preusmeritvi uporabimo
exit(). - Zaščitene strani morajo preverjati, ali je uporabnik prijavljen.
Pozor: Če na zaščitenih straneh ne preverjamo prijave, odjava sama po sebi ne zadošča. Vsaka zaščitena stran mora preveriti, ali so v seji še vedno ustrezni podatki o prijavi.
Odjava uporabnika iz aplikacije
Ko se uporabnik odjavi, moramo izbrisati vse pomembne podatke, ki jih je aplikacija shranila v sejo. Tako poskrbimo, da zaščiteni del aplikacije po odjavi ni več dostopen.
Pri odjavi običajno izvedemo naslednje korake:
- zaženemo sejo,
- počistimo podatke iz seje,
- sejo uničimo,
- uporabnika preusmerimo na prijavno ali začetno stran.
Odjava je pomembna predvsem pri aplikacijah, kjer uporabniki dostopajo do osebnih podatkov ali administrativnega dela sistema.
Pomni: Funkcija session_unset() odstrani spremenljivke iz seje, funkcija session_destroy() pa uniči podatke trenutne seje na strežniku.
Osnovni primer pri klasičnem PHP pristopu
Pri odjavi sama podatkovna zbirka pogosto ni več potrebna, saj so podatki o prijavi običajno shranjeni v seji. Spodnji primer prikazuje klasičen postopek odjave uporabnika.
<?php
session_start();
// Počistimo vse podatke iz seje
session_unset();
// Sejo uničimo
session_destroy();
// Uporabnika preusmerimo na prijavno stran
header('Location: 15_login.php');
exit();
?>
Tak zapis je primeren, kadar želimo odstraniti vse podatke iz trenutne seje in uporabnika vrniti na prijavno stran 15_login.php.
Odjava v aplikaciji, ki uporablja PDO
Tudi če je bila prijava izvedena z uporabo PDO, je sama odjava praviloma enaka. Pri odjavi zaključimo sejo, ne glede na to, s katerim vmesnikom smo dostopali do baze.
<?php
session_start();
// Počistimo podatke o prijavi
unset($_SESSION['user_id'], $_SESSION['logged_in']);
// Po želji odstranimo še vse preostale podatke iz seje
session_unset();
// Sejo uničimo
session_destroy();
// Preusmeritev na prijavo
header('Location: 15_login.php');
exit();
?>
V tem primeru najprej izrecno odstranimo podatka user_id in logged_in, nato pa počistimo še preostale podatke iz seje.
Kaj se zgodi s sejo?
Seja omogoča, da si aplikacija med več zahtevki zapomni podatke o uporabniku. Pri prijavi vanjo običajno shranimo identifikator uporabnika in čas prijave. Pri odjavi te podatke odstranimo.
| Ukaz | Namen |
|---|---|
session_start() |
Odpre obstoječo sejo ali začne novo sejo, da lahko dostopamo do $_SESSION. |
unset($_SESSION['user_id']) |
Odstrani posamezen podatek iz seje. |
session_unset() |
Odstrani vse spremenljivke trenutne seje. |
session_destroy() |
Uniči podatke trenutne seje na strežniku. |
header('Location: 15_login.php') |
Uporabnika preusmeri na prijavno stran 15_login.php. |
Pozor: Pred uporabo funkcije header() ne sme biti izpisa v brskalnik. Po preusmeritvi uporabimo exit(), da se izvajanje skripte ustavi.
Zaščitene strani po odjavi
Odjava odstrani podatke iz seje, vendar morajo zaščitene strani še vedno preverjati, ali je uporabnik prijavljen. Če tega preverjanja ni, lahko uporabnik neposredno odpre zaščiteno datoteko.
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: 15_login.php');
exit();
}
?>
Takšno preverjanje je smiselno vključiti na začetek vsake zaščitene strani.
Pomni: Odjava in zaščita strani sta povezana postopka. Odjava odstrani podatke o prijavi, zaščitene strani pa preverjajo, ali ti podatki še obstajajo.
Primerjava prijave in odjave
Prijava in odjava imata nasprotni nalogi. Pri prijavi ustvarimo prijavno stanje, pri odjavi pa ga odstranimo.
| Prijava | Odjava |
|---|---|
| Preveri uporabniško ime in geslo. | Ne preverja gesla, ampak zaključi trenutno sejo. |
| Uporabi podatkovno bazo za iskanje uporabnika. | Podatkovna baza običajno ni potrebna. |
V $_SESSION shrani podatke o uporabniku. |
Iz $_SESSION odstrani podatke o uporabniku. |
| Uporabnika preusmeri na zaščiteno stran. | Uporabnika preusmeri na prijavno ali začetno stran. |
Aplikacija Knjige
📘Aplikacija Knjige
V priloženi aplikaciji je odjava izvedena v datoteki 15_logout.php. Datoteka najprej zažene sejo z ukazom session_start(), saj lahko podatke iz seje brišemo le, če je seja odprta.
Nato aplikacija s funkcijo session_unset() počisti vse podatke iz seje in s funkcijo session_destroy() sejo dokončno uniči. Tako po odjavi v aplikaciji ne ostanejo več podatki o prijavi uporabnika.
Na koncu uporabnika preusmeri nazaj na prijavno stran 15_login.php. Nadaljnji dostop do zaščitenih strani je mogoč šele po novi prijavi.
15_logout.phpNavodila za izdelavo odjave
- Najprej zaženemo sejo s funkcijo
session_start(). - Počistimo vse podatke, povezane s prijavo uporabnika.
- Po potrebi odstranimo vse preostale podatke iz seje.
- Sejo uničimo s funkcijo
session_destroy(). - Uporabnika preusmerimo na prijavno ali začetno stran aplikacije.
- Po preusmeritvi uporabimo
exit(). - Na zaščitenih straneh preverjamo, ali je uporabnik po odjavi še prijavljen.
Pozor: Odjavna datoteka naj ne vsebuje nepotrebnega HTML izpisa pred preusmeritvijo. Če pride do izpisa pred funkcijo header(), preusmeritev morda ne bo delovala.
Priporočila
- Odjavo izvedi v ločeni datoteki, na primer
15_logout.php. - Na začetku odjavne datoteke uporabi
session_start(). - Odstrani podatke, ki označujejo prijavljenega uporabnika.
- Uporabi
session_unset()insession_destroy(), kadar želiš zaključiti celotno sejo. - Po odjavi uporabnika preusmeri na prijavno stran.
- Po preusmeritvi uporabi
exit(). - Na zaščitenih straneh vedno preveri
$_SESSION['user_id']ali ustrezen prijavni podatek.
Pogoste napake
- Manjka
session_start(), zato se podatki seje ne obdelajo pravilno. - Odstrani se samo del podatkov, drugi prijavni podatki pa ostanejo v
$_SESSION. - Po odjavi manjka
session_destroy(). - Po preusmeritvi manjka
exit(). - Pred funkcijo
header()je že izveden izpis v brskalnik. - Zaščitene strani ne preverjajo, ali je uporabnik prijavljen.
- Odjava je izvedena samo kot sprememba povezave, brez dejanskega brisanja seje.
Odjava mora biti povezana s preverjanjem zaščitenih strani. Če zaščitene strani ne preverjajo seje, lahko ostanejo dostopne tudi po odjavi.