Načrtovanje in razvoj spletnih aplikacij

Seje v PHP

Seja oziroma session omogoča, da PHP med več zahtevki istega uporabnika ohrani podatke. Na strani uporabnika je običajno shranjen le identifikator seje, dejanski podatki pa se hranijo na strežniku.

Pomni: Seja omogoča, da si spletna aplikacija med različnimi obiski istega uporabnika zapomni pomembne podatke, na primer prijavo, košarico ali začasne nastavitve.

Osnovna pravila pri uporabi sej

  • Sejo začnemo ali nadaljujemo z ukazom session_start();.
  • Podatke beremo in zapisujemo prek polja $_SESSION.
  • $_SESSION uporabljamo kot asociativno polje.
  • session_start() mora biti izveden pred izpisom HTML vsebine.

Pozor: Če session_start() pokličemo prepozno, torej po izpisu vsebine, lahko PHP javi napako pri pošiljanju glav HTTP.

Kaj je v PHP seja

PHP seja je mehanizem za ohranjanje podatkov med več zahtevki. Podatki so v programu dostopni prek polja $_SESSION, ki je preddefinirano superglobalno asociativno polje.

Pomni: Polje $_SESSION je na voljo povsod v skripti in ga ni treba posebej prenašati med funkcijami kot navadno lokalno spremenljivko.

Začetek seje in zapis podatka

Ko želimo v sejo zapisati podatek, najprej zaženemo sejo, nato pa v polje $_SESSION dodamo nov ključ.

<?php
session_start();

if (!isset($_SESSION['moja_seja'])) {
    $_SESSION['moja_seja'] = bin2hex(random_bytes(16));
}

echo 'Vrednost moje seje: ' . $_SESSION['moja_seja'];
?>
Vrednost moje seje: e136e858688fc603fabcb5625f6a30c5

Pozor: V starejši kodi pogosto vidimo zapise, ki ob vsakem nalaganju strani ustvarijo novo vrednost seje. To ni primerno, če želimo podatek v seji ohraniti med več zahtevki.

Primer: števec obiskov strani

Seje pogosto uporabljamo za shranjevanje začasnih podatkov o uporabniku. Preprost primer je števec ogledov strani.

<?php
session_start();

if (!isset($_SESSION['stevec'])) {
    $_SESSION['stevec'] = 1;
} else {
    $_SESSION['stevec']++;
}

echo 'Ogledov: ' . $_SESSION['stevec'];
?>
Ogledov: 1

Brisanje podatkov iz seje

Če želimo odstraniti samo en podatek iz seje, uporabimo unset(). Če želimo uničiti podatke celotne seje, uporabimo session_destroy().

<?php
session_start();

// izbriše en ključ
unset($_SESSION['stevec']);

// uniči podatke seje
session_destroy();
?>

Pozor: session_destroy() izbriše podatke seje, ne odstrani pa samodejno vseh vrednosti iz trenutne skripte ali piškotka seje. Pri popolni odjavi običajno počistimo tudi $_SESSION.

Varnostno priporočilo

Po prijavi uporabnika je priporočljivo zamenjati identifikator seje, da zmanjšamo tveganje zlorabe obstoječega ID-ja seje.

<?php
session_start();

// po uspešni prijavi
session_regenerate_id(true);
$_SESSION['uporabnik'] = 'ana';
?>

Pomni: Po uspešni prijavi je dobra praksa uporabiti session_regenerate_id(), ker s tem dobimo nov identifikator seje.

Česa ne shranjujemo v sejo

V sejah običajno hranimo manjše količine podatkov, kot so identifikatorji, uporabniško ime, vloga uporabnika ali vsebina košarice. V sejo ni primerno shranjevati vsega, poleg tega pa nekaterih vrst podatkov, na primer resource, ni mogoče hraniti.

Pozor: V sejo praviloma ne shranjujemo velikih količin podatkov ali neprimernih tipov. Za trajne podatke raje uporabimo podatkovno zbirko.

Pogoste napake

  • izpuščanje klica session_start();,
  • klic funkcije session_start(); šele po izpisu HTML-vsebine,
  • nepotrebno prepisovanje podatkov v seji ob vsakem nalaganju strani,
  • napačno enačenje seje in piškotka,
  • brisanje le enega ključa namesto celotne seje ob odjavi.