W jaki sposób, stosując język PHP, można usunąć ciasteczko o nazwie ciastko?
A.
setcookie("ciastko", "", time()-3600);
B.
setcookie("$ciastko", "", 0);
C.
unsetcookie("$ciastko");
D.
deletecookie("ciastko");
Pytanie z egzaminu CKE, czerwiec 2023 (arkusz EE.09-SG-23.06).
Usunięcie ciasteczka w PHP robi się praktycznie przez ponowne wysłanie nagłówka Set-Cookie dla tej samej nazwy, ale z datą wygaśnięcia ustawioną w przeszłości. Dlatego zapis setcookie("ciastko", "", time() - 3600); jest właściwy: funkcja setcookie() wskazuje nazwę ciasteczka, ustawia pustą wartość i podaje czas ważności wcześniejszy niż aktualny czas serwera. Przeglądarka dostaje wtedy informację, że cookie jest już nieważne, więc je usuwa. To wynika z działania mechanizmu HTTP cookies, a nie z jakiejś osobnej instrukcji kasowania. W praktyce warto pamiętać, że przy usuwaniu trzeba użyć tych samych parametrów path, domain, secure i httponly, z którymi ciasteczko było utworzone, np. setcookie("ciastko", "", time() - 3600, "/");. Inaczej przeglądarka może potraktować to jako inne ciasteczko. Z mojego doświadczenia to częsty błąd przy wylogowaniu użytkownika: usuwa się cookie sesyjne, ale z inną ścieżką i potem wygląda, jakby aplikacja dalej pamiętała login. Dobra praktyka to też wywoływać setcookie() przed wysłaniem jakiejkolwiek treści HTML, bo PHP musi wysłać nagłówek HTTP przed body odpowiedzi.
W PHP nie usuwa się ciasteczek za pomocą osobnej funkcji typu deletecookie() albo unsetcookie(), bo takie standardowe funkcje po prostu nie istnieją. To jest dość typowa pułapka: nazwy brzmią logicznie, więc ktoś zakłada, że język ma gotową instrukcję do kasowania cookie. Mechanizm ciasteczek działa jednak po stronie przeglądarki i jest sterowany nagłówkiem HTTP Set-Cookie. Serwer nie kasuje pliku bezpośrednio u użytkownika, tylko wysyła instrukcję, że dane ciasteczko ma wygasnąć. Dlatego używa się setcookie() z czasem z przeszłości, najczęściej time() - 3600. Ustawienie czasu na 0 nie jest tym samym. W PHP oznacza to zwykle ciasteczko sesyjne, czyli takie ważne do zamknięcia przeglądarki, a nie natychmiastowe usunięcie. Dodatkowo zapis setcookie("$ciastko", "", 0) sugeruje użycie zmiennej w nazwie cookie. Jeśli zmienna $ciastko nie ma odpowiedniej wartości, nazwa będzie błędna albo pusta, więc przeglądarka nie trafi w ciasteczko o nazwie ciastko. Moim zdaniem warto też odróżniać usunięcie wpisu z tablicy $_COOKIE od usunięcia cookie w przeglądarce. unset($_COOKIE["ciastko"]) może pomóc tylko w bieżącym wykonaniu skryptu, ale nie wysyła do klienta polecenia skasowania ciasteczka. Poprawne podejście powinno więc opierać się na setcookie(), tej samej nazwie, najlepiej tej samej ścieżce i domenie, oraz czasie wygaśnięcia ustawionym w przeszłości.