Načrtovanje in razvoj spletnih aplikacij

Piškotki v PHP

Piškotek oziroma cookie je majhen podatek, ki ga strežnik pošlje brskalniku, brskalnik pa ga shrani in ob naslednjih zahtevah pošlje nazaj strežniku. Piškotke uporabljamo za shranjevanje manjših količin podatkov, na primer nastavitev, oznake zadnjega obiska ali identifikatorja.

Pomni: Piškotki se hranijo v brskalniku uporabnika, zato niso namenjeni shranjevanju občutljivih ali velikih količin podatkov.

Za kaj uporabljamo piškotke

  • za shranjevanje uporabniških nastavitev,
  • za zaznavo prejšnjih obiskov strani,
  • za ohranjanje nekaterih podatkov med obiski,
  • za prenos identifikatorja seje.

Kako v PHP ustvarimo piškotek

Piškotek ustvarimo s funkcijo setcookie(). V sodobnejši kodi pogosto uporabimo različico z nastavitvenim poljem.

<?php
setcookie('ime', 'vrednost', [
    'expires' => time() + 3600,
    'path' => '/',
    'secure' => isset($_SERVER['HTTPS']),
    'httponly' => true,
    'samesite' => 'Lax'
]);
?>

Pozor: Funkcijo setcookie() moramo poklicati pred kakršnimkoli izpisom vsebine, enako kot pri pošiljanju drugih glav HTTP.

Pogoste možnosti pri setcookie()

Možnost Opis
expires Določa čas poteka piškotka kot Unixovo časovno značko.
path Določa, na katerem delu strani oziroma poti bo piškotek na voljo.
domain Določa domeno ali poddomeno, kjer bo piškotek veljal.
secure Če je true, se piškotek pošilja le po povezavi HTTPS.
httponly Če je true, piškotek ni dostopen prek JavaScripta.
samesite Določa obnašanje piškotka pri zahtevah z drugih strani, na primer Lax, Strict ali None.

Pomni: Če uporabimo SameSite=None, mora biti hkrati nastavljen tudi secure=true, sicer bo odjemalec tak piškotek zavrnil.

Branje piškotka

Vrednost piškotka preberemo prek polja $_COOKIE. Piškotek, ki smo ga pravkar nastavili, je praviloma v PHP na voljo šele pri naslednji zahtevi oziroma po osvežitvi strani.

<?php
if (isset($_COOKIE['zadnjiObisk'])) {
    $visit = $_COOKIE['zadnjiObisk'];
    echo "Vaš zadnji obisk: " . htmlspecialchars($visit);
} else {
    echo "Trenutno nimate nobenega piškotka!";
}
?>
Trenutno nimate nobenega piškotka!

Pozor: Vrednosti piškotkov ne obravnavamo kot popolnoma zaupanja vrednih, ker prihajajo iz brskalnika uporabnika. Tudi PHP opozarja, da v piškotke ne smemo shranjevati občutljivih podatkov.

Brisanje piškotka

Piškotek izbrišemo tako, da mu nastavimo čas poteka v preteklosti. Pri tem morajo biti uporabljeni isti pomembni parametri kot pri nastavitvi, na primer ime in pot.

<?php
setcookie('TestCookie', '', [
    'expires' => time() - 3600,
    'path' => '/'
]);
?>

Izpis vseh piškotkov

<?php
print_r($_COOKIE);
?>

Primer polja piškotkov

PHP podpira tudi zapis z oglatimi oklepaji v imenu piškotka, tako da vrednosti v programu preberemo kot polje. PHP dokumentacija navaja, da tak zapis ni skladen z RFC 6265 za ime piškotka, vendar ga uporabniški agenti praviloma podpirajo.

<?php
setcookie('piskotek[prvi]', 'prvi piškotek');
setcookie('piskotek[drugi]', 'drugi piškotek');
setcookie('piskotek[tretji]', 'tretji piškotek');

// izpis po osvežitvi strani
if (isset($_COOKIE['piskotek'])) {
    foreach ($_COOKIE['piskotek'] as $ime => $vrednost) {
        echo htmlspecialchars($ime) . ' : ' . htmlspecialchars($vrednost) . '<br>';
    }
} else {
    echo 'Trenutno nimate nobenega piškotka!';
}
?>
Trenutno nimate nobenega piškotka!

Pogoste napake

  • klic funkcije setcookie() po izpisu HTML-vsebine,
  • napačno pričakovanje, da bo nov piškotek v isti zahtevi takoj na voljo v $_COOKIE,
  • shranjevanje občutljivih podatkov v piškotek,
  • izpuščanje parametra path pri brisanju piškotka,
  • neuporaba osnovnih varnostnih nastavitev, kot so secure, httponly in samesite.