Ciasteczka (ang. cookies) to niewielkie informacje tekstowe, wysyłane przez serwer WWW i zapisywane po stronie użytkownika (zazwyczaj na twardym dysku). Domyślne parametry ciasteczek pozwalają na odczytanie informacji w nich zawartych jedynie serwerowi, który je utworzył. Ciasteczka są stosowane najczęściej w przypadku liczników, sond, sklepów internetowych, stron wymagających logowania, reklam i do monitorowania aktywności odwiedzających.

Mechanizm ciasteczek został wymyślony przez byłego pracownika Netscape Communications – Lou Montulliego.

Spis treści

edytuj Zastosowanie

Ciasteczka mogą zawierać rozmaite rodzaje informacji o użytkowniku danej strony WWW i "historii" jego łączności z daną stroną (a właściwie serwerem). Zazwyczaj wykorzystywane są do automatycznego rozpoznawania danego użytkownika przez serwer, dzięki czemu może on wygenerować przeznaczoną dla niego stronę. Umożliwia to tworzenie spersonalizowanych serwisów WWW, obsługi logowania, "koszyków zakupowych" w internetowych sklepach itp.

Zastosowanie ciasteczek do sond i liczników internetowych wygląda następująco - serwer może łatwo sprawdzić, czy z danego komputera oddano już głos lub też czy odwiedzono daną stronę, na tej podstawie wykonać odpowiednie operacje i wygenerować dla użytkownika zindywidualizowaną treść strony. Schematyczny sposób wykorzystywania ciasteczek przy obsłudze licznika internetowego, wykluczającego przeładowania (zwiększanie liczby odwiedzin przy odświeżeniu strony) przedstawiony jest poniżej:

Schemat działania licznika internetowego wykluczającego przeładowania

Część serwisów korzysta z ciasteczek jako sposobu przenoszenia między stronami loginu i zaszyfrowanego hasła (rozwiązanie mniej bezpieczne), lub też spreparowanej informacji o zalogowaniu (rozwiązanie bezpieczne), dzięki czemu nie jest konieczne logowanie na każdej podstronie. Wyłączenie obsługi ciasteczek uniemożliwia często zalogowanie się, co może być rozwiązane poprzez przechowywanie danych o zalogowaniu po stronie serwera, zawsze jednak użytkownik musi zostać w jakiś sposób zidentyfikowany (np. poprzez identyfikator sesji zawarty w adresie URL).

edytuj Specyfika działania

Mechanizm ciasteczek został wprowadzony po to, by w bezstanowym protokole HTTP umożliwić odróżnienie osób odwiedzających dany serwis. Ciasteczka są informacjami zapisywanymi trwale lub tymczasowo na żądanie serwera na dysku użytkownika. Najczęściej przechowywane są w jednym pliku tekstowym lub binarnym.

Dane zapisane w ciasteczkach mają postać naprzemiennych ciągów nazwy i wartości odpowiadającej jej zmiennej. Serwer WWW chcąc wysłać żądanie utworzenia ciasteczka na dysku użytkownika dołącza do nagłówka HTTP polecenie "Set-Cookie", po którym następuje ciąg przekazywanych danych. Zapamiętane ciasteczko może najczęściej odczytać jedynie serwer, który je wysłał. W danych po poleceniu Set-Cookie określone są:

  • nazwa i przypisanÄ… jej wartość,
  • domena i Å›cieżka dostÄ™pu, które sÄ… zwiÄ…zane z przekazywanym ciasteczkiem,
  • czas ważnoÅ›ci danego ciasteczka (po jego upÅ‚yniÄ™ciu przeglÄ…darka usunie je).

Do zapisania ciasteczka wymagana jest jedynie jego nazwa. Jeśli nie zostanie podana domena, do wartości zapisanych w ciasteczku dostęp będzie miał jedynie serwer, z którego wysłano żądanie zapisu. Niepodanie czasu ważności spowoduje usunięcie ciasteczka po zamknięciu przeglądarki. Ciasteczka, które wygasają po zakończonej sesji, zwane są ciasteczkami sesyjnymi. Mają one ustalony okres ważności, którego mechanizm wymusza serwer (zwykle nie można polegać bowiem na prawidłowości ustawienia zegara na komputerze z przeglądarką).

Działanie mechanizmu ciasteczek po stronie użytkownika zależy od konfiguracji jego przeglądarki. Niektóre z nich umożliwiają odmowę zapisu, inne pozwalają na ustawienie daty wygaśnięcia innej od tej deklarowanej w nagłówku HTTP. Zaawansowaną kontrolę nad zachowaniem ciasteczek posiadają m.in. Firefox, Opera i inne nowoczesne przeglądarki.

edytuj Składnia nagłówka HTTP

Nagłówek wysłany przez serwer ma następującą postać:

Set-Cookie: nazwa=wartość; expires=DATA; path=ŚCIEŻKA; domain=DOMENA; secure
nazwa=wartość
Wartość ta jest jedynym wymaganym atrybutem przy wysyÅ‚aniu ciasteczka. SkÅ‚ada siÄ™ z dowolnych znaków z wyjÄ…tkiem Å›redników, przecinków, biaÅ‚ych spacji i slashów (/). JeÅ›li zajdzie potrzeba ich użycia, najczęściej koduje siÄ™ je w formacie odpowiednim dla URL (%XX), gdzie XX to kod ASCII znaku (np. %2F to zakodowana postać slasha, a %20 – spacji).
expires=data
Atrybut expires informuje przeglądarkę o dacie wygaśnięcia danego ciasteczka. Zostanie ono usunięte z dysku, gdy jego data ważności zostanie przekroczona. Jeśli nie podano daty wygaśnięcia, to ciasteczko zostanie usunięte po zakończeniu sesji.
Data musi być podana w następującym formacie (przykład): "Tuesday, 05-Nov-2004 08:30:09 GMT"
Format ten oparty jest na RFC 822, RFC 850, RFC 1036, i RFC 1123 z drobną zmianą odnośnie separatora daty - tu występuje kreska, podana jest również strefa czasowa GMT [1].
domain=domena
Ten parametr określa widoczność ciasteczka. W trakcie sprawdzania pliku na komputerze klienta zawierającego ciasteczka, przeglądarka porównuje zapisaną domenę z domeną serwera, do którego wysyła nagłówki. Przeglądarka wysyła wszystkie nie przeterminowane ciasteczka, których domena jest zawarta w domenie serwera (dodatkowo może być sprawdzana ścieżka wywoływanego pliku i typ połączenia).
W specyfikacji Netscape'a [1] wprowadzone jest w tym zakresie dodatkowe ograniczenie. To znaczy domena zostanie dopasowana, jeśli zawiera minimum dwie kropki, albo minimum trzy – jeśli domena główna serwera nie jest jedną z domen specjalnych, czyli: "COM", "EDU", "NET", "ORG", "GOV", "MIL", "INT". Ma to zapobiegać ustawianiu domen typu ".com", ".edu", czy "va.us". Może to jednak powodować nieoczekiwane rezultaty, ponieważ ustawienie dla ciasteczka domeny w formacie "domena.org" spowoduje, że ciasteczka będę widoczne tylko dla danej domeny, ale nie będą wysyłane do poddomen, czyli np. "forum.domena.org". Problem ten omija się ustawiając domenę ".domena.org" [2].
Domyślnie domain przyjmuje wartość domeny strony, z której wysłano żądanie zapisu ciasteczka.
path=ścieżka
Atrybut path jest podawany w celu ograniczenia widoczności ciasteczka do danej ścieżki dostępu do katalogu (liczy się ścieżka widoczna w URL-u pliku, a nie rzeczywiste położenie na dysku serwera). Wszystkie strony umieszczone w tym katalogu i jego podkatalogach będą mogły je wykorzystać. Należy zauważyć, że podanie parametru path w postaci "/wiki" pozwoli na odczytanie danych z ciasteczek plikom w katalogach "/wikipedia", "/pl/Cookie" itp.
Widoczność ciasteczka będzie niezależna od położenia pliku, jeśli podana została ścieżka "/". Natomiast domyślnie path przyjmuje wartość ścieżki do strony, z której wysłano żądanie zapisu ciasteczka.
secure
Ten parametr nie posiada wartości. Jeśli zostanie podany, to ciasteczko będzie widoczne (wysłane) tylko wtedy gdy połączenie będzie szyfrowane (obecnie możliwe przy użyciu protokołu HTTPS).

Przy pobieraniu zawartości strony z serwera, przeglądarka sprawdzi (jak podano powyżej) zapamiętane ciasteczka, w których parametry domeny i ścieżki zgadzają się z adresem URL strony. Jeśli je znajdzie, dołącza je do nagłówka HTTP w postaci:

Cookie: nazwa_ciasteczka_1=wartosc_ciasteczka_1; nazwa_ciasteczka_2=wartosc_ciasteczka_2; ...

edytuj Właściwości

  • Ciasteczka o tej samej nazwie ale o innych Å›cieżkach bÄ™dÄ… nadpisywane.
  • W celu skasowania należy wysÅ‚ać ciasteczko o takiej samej nazwie i czasie wygaÅ›niÄ™cia z minionÄ… datÄ….
  • Możliwe jest wysyÅ‚anie kilku ciasteczek w jednym nagłówku (poprzez kilka atrybutów Set-Cookie).
  • IstniejÄ… limity przy zapisywaniu ciasteczek na dysku (po ich przekroczeniu przeglÄ…darka usuwa starsze ciasteczka).
    • maksymalna liczba ciasteczek: 300.
    • maksymalna wielkość ciasteczka: 4 kilobajty.
    • maksymalna liczba ciasteczek z jednego serwera lub z jednej Å›cieżki: 20.
  • Gdy jest zainstalowany serwer Proxy nagłówki Set-Cookie nie powinny być przechowywane w pamiÄ™ci proxy.
  • Jeżeli serwer Proxy dostanie odpowiedź z nagłówkiem zawierajÄ…cym Set-Cookie powinien go przekazać do klienta bez wzglÄ™du na rodzaj odpowiedzi np. 304 (nagłówek niezmieniony) czy 200 (nagłówek inny niż zapisany w cache'u).

edytuj Argumenty przeciw

Menedżer ciasteczek Firefoksa

Niektórzy są wrogami mechanizmu ciasteczek. Niechęć ta wynika z następujących przesłanek:

  • Mechanizm ten jest bardzo niedoskonaÅ‚y.potrzebne ÅºródÅ‚o JeÅ›li nie skonfiguruje siÄ™ poprawnie kont użytkowników w systemie, to tak naprawdÄ™ nie rozpoznaje on użytkownika, tylko jego przeglÄ…darkÄ™ internetowÄ…. Powoduje to, że z jednej strony osoba korzystajÄ…ca z kilku takich komputerów lub kilku przeglÄ…darek na jednym komputerze nie jest rozpoznawana poprawnie; z drugiej strony jeÅ›li kilka osób korzysta z tego samego komputera i przeglÄ…darki, mechanizm nie może ich rozróżnić.
  • Do dzisiaj krążą plotki, jakoby ciasteczka byÅ‚y źródÅ‚em rozprzestrzeniania siÄ™ wirusów. W rzeczywistoÅ›ci jest to niemożliwe - nie można zainfekować komputera wirusem jedynie z powodu włączonej obsÅ‚ugi ciasteczek.
  • Niechęć do ciasteczek bierze siÄ™ również z niedostatecznych metod zarzÄ…dzania nimi. Nowoczesne przeglÄ…darki posiadajÄ… zaawansowane menedżery, które w intuicyjny sposób pozwalajÄ… zarzÄ…dzać informacjami zawartymi w ciasteczkach, lecz znaczna część użytkowników korzysta z Internet Explorera, w którym nie ma takich opcji (aczkolwiek istniejÄ… programy firm trzecich, które to umożliwiajÄ…)
  • Mechanizm ciasteczek dziaÅ‚a bez Å›wiadomoÅ›ci i wiedzy użytkownika, naruszajÄ…c jego prywatność. CzÄ™sto stosowany jest w monitorowaniu zachowaÅ„ i aktywnoÅ›ci użytkowników, np. portale i sklepy internetowe mogÄ… gromadzić w ten sposób informacje o zainteresowaniach użytkowników i wyÅ›wietlać reklamy o treÅ›ci nawiÄ…zujÄ…cej do odwiedzanych stron. Co prawda wiÄ™kszość przeglÄ…darek ma możliwość caÅ‚kowitego blokowania ciasteczek lub włączenia opcji ostrzegajÄ…cej każdorazowo o ich przesyÅ‚aniu, lecz ogromna wiÄ™kszość użytkowników albo w ogóle nie wie, co to jest ciasteczko, albo po krótkim czasie odblokowuje ten mechanizm, gdyż bez niego nie można skorzystać z wielu serwisów.

edytuj Alternatywa dla ciasteczek - dane w adresie URL

Stub sekcji Ta sekcja jest zalążkiem. Jeśli możesz, rozbuduj ją.

Gdy użytkownik ma wyłączoną obsługę ciasteczek, wówczas dane należy przesłać w inny sposób. W ramach protokołu HTTP jest to możliwe przy użyciu metody GET bądź POST. W praktyce jednak używa się jedynie metody GET — ze względu na łatwość jej użycia oraz na to, że metoda POST jest związana głównie z formularzami.

Zastosowanie metody GET wiąże się jednak z koniecznością podania danych w adresie URL. Jest to jednak zadaniem kłopotliwym i niebezpiecznym, ponieważ sprowadza się do konieczności dodawania odpowiednich parametrów do wszystkich wewnętrznych linków zawartych na stronach serwisu [3]. Jest to kłopotliwe ze względu na potencjalną ilość takich danych, a niebezpieczne ze względu na to, że użytkownik może np. chcieć zachować taką stronę i nie będąc świadomy zawartych w niej poufnych danych, wysłać komuś mailem.

edytuj Blokowanie ciasteczek

Wszystkie nowoczesne przeglądarki pozwalają na włączenie bądź wyłączenie mechanizmu ciasteczek (domyślnie zazwyczaj jest on włączony).

edytuj Internet Explorer

Narzędzia > Opcje internetowe > Prywatność > Zaawansowane > Zastąp automatyczną obsługę plików cookie

  • Zaznaczenie opcji ZABLOKUJ powoduje wyłączenie akceptowania plików Cookie.
  • NarzÄ™dzia > Opcje internetowe > Ogólne > UsuÅ„ pliki cookie
    Usuwa wszystkie ciasteczka aktywnego użytkownika

edytuj Firefox

Narzędzia > Opcje > Prywatność

  • Akceptuj ciasteczka - decyduje czy ciasteczka majÄ… być przechowywane.
  • Akceptuj ciasteczka z innych witryn - odznaczenie tego pola ogranicza stosowanie ciasteczek tylko do pierwotnej witryny.
  • Przechowuj:
    • aż wygasnÄ… - pozwala to witrynom na okreÅ›lenie, jak dÅ‚ugo ciasteczka majÄ… być przechowywane przez przeglÄ…darkÄ™,
    • do zamkniÄ™cia programu Firefox - wszystkie ciasteczka bÄ™dÄ… usuwane w momencie zamkniÄ™cia przeglÄ…darki,
    • pytaj za każdym razem - przeglÄ…darka wymagać bÄ™dzie od użytkownika odpowiedzi na pytanie jak dÅ‚ugo ma przechowywać ciasteczko (albo czy ma je odrzucić).
  • WyjÄ…tki - pozwala ustawić witryny, dla których ciasteczka bÄ™dÄ… / nie bÄ™dÄ… blokowane.
  • WyÅ›wietl ciasteczka - uruchamia menedżera ciasteczek, za pomocÄ… którego można przejrzeć lub usunąć poszczególne ciasteczka.

edytuj Opera

Narzędzia > Preferencje > Zaawansowane > Ciasteczka

  • Sterowanie obsÅ‚ugÄ… ciasteczek odbywa siÄ™ albo poprzez wyłączenie opcji akceptowania ciasteczek, albo też przez bardziej rozbudowany panel, dajÄ…cy bardziej szczegółowÄ… kontrolÄ™ blokowania lub odblokowywania poszczególnych rodzajów ciasteczek.
  • UdostÄ™pniony jest także mechanizm umożliwiajÄ…cy przeglÄ…danie ciastek pochodzÄ…cych z poszczególnych domen, kasowanie ciasteczek, bÄ…dź danych z danego serwera, jak też pozwalajÄ…cy na blokowanie ciasteczek z danej domeny.

edytuj Safari

Safari > Preferencje > Bezpieczeństwo

  • Wybierz jednÄ… z opcji: "Zawsze akceptuj ciasteczka" lub "Nigdy nie akceptuj ciasteczek"

edytuj Funkcje zapisujące i pobierające wartości ciasteczek

edytuj PHP

  • Zapis odbywa siÄ™ za pomocÄ… funkcji setcookie(). Przyjmuje ona nastÄ™pujÄ…ce parametry:
setcookie ( nazwa, wartość, data_ważności, ścieżka, domena, bezpieczeństwo)
  • nazwa (string) – nazwa ciasteczka,
  • wartość (string) – wartość ciasteczka,
  • data_wygaÅ›niÄ™cia (integer) – wyrażona liczbami caÅ‚kowitymi liczba sekund od epoki Uniksa, oznaczajÄ…ca moment do którego ciasteczko jest ważne,
  • Å›cieżka (string) – Å›cieżka dostÄ™pu, z której możliwy jest odczyt,
  • domena (string) – domena serwera ustawiajÄ…cego ciasteczko,
  • bezpieczeÅ„stwo (boolean) – jeÅ›li ustawione, to ciasteczko przesyÅ‚ane jest za pomocÄ… protokoÅ‚u HTTPS.

Wywołanie funkcji setcookie() musi się odbyć przed wysłaniem jakichkolwiek treści do użytkownika. Fragmenty kodu PHP w dokumencie HTML opatrywane są znacznikami <?php i ?>.

  • WartoÅ›ci ciasteczek automatycznie pobierane sÄ… jako zmienne przechowywane w tablicy $_COOKIE. Programista nie musi dbać o wÅ‚asne funkcje odczytu danych z ciasteczek.
  • WiÄ™cej: [1]

edytuj ASP

  • Zapis odbywa siÄ™ przy pomocy funkcji Response.Cookies() :
Response.Cookies("nazwa")("fname") = "nazwa"
Response.Cookies("nazwa")("lname") = "wartosc"
Response.Cookies("nazwa").Domain = "domena"
Response.Cookies("nazwa").Expires = data_wygasniecia
  • nazwa (string) – nazwa ciasteczka,
  • wartosc (string) – wartość ciasteczka,
  • domena (string) - domena serwera ustawiajÄ…cego ciasteczko,
  • data_wygasniecia (integer) - podana w dniach, np. Date+365 oznacza rok ważnoÅ›ci.

Wywołanie funkcji setcookie() musi się odbyć przed wysłaniem jakichkolwiek treści do użytkownika. Fragmenty kodu ASP opatrywane są znacznikami <% i %>.

  • Pobranie wartoÅ›ci ciasteczka odbywa siÄ™ za pomocÄ… funkcji Request.Cookies() :
Request.Cookies("nazwa")("fname") 
  • nazwa (string) – nazwa ciasteczka.

Można ją przypisać do zmiennej lub też na przykład wydrukować na ekranie funkcją Response.Write() .

edytuj Perl przez interfejs CGI

  • Zapis odbywa siÄ™ za pomocÄ… funkcji:
my $q=NEW CGI;
&setCookies($q);
my $nazwa_cookie = $q->cookie( -name => 'nazwa', -value => 'wartosc', -expires => 'data');
print $q->header( -cookie => [$nazwa_cookie]);
  • nazwa – nazwa ciasteczka,
  • wartosc – wartość ciasteczka,
  • data – data wygaÅ›niÄ™cia, np. +1m oznacza miesiÄ…c żywotnoÅ›ci.
  • Pobranie wartoÅ›ci ciasteczka
my $zmienna = $q->cookie( 'nazwa_ciasteczka' );

Przypisuje zmiennej zmienna wartość ciasteczka o nazwie nazwa_ciasteczka.

edytuj JavaScript

edytuj Zapis

Zapis odbywa się za pomocą przypisania wartości do document.cookie:

document.cookie = "nazwa=wartość; expires=data; path=ścieżka; domain=domena; secure";

Składnia poszczególnych parametrów jest taka jak dla nagłówka HTTP. Kolejność jest dowolna, na końcu nie trzeba dodawać średnika.

Najprostszy przykład
document.cookie = "nazwa=wartosc;" // ważne - polskie znaki muszą być zakodowane jeśli mają być użyte
Pełny przykład

wyślij tylko przez szyfrowane:

document.cookie = "nazwa1=wart1; path=/; expires=Fri, 09 Mar 2007 16:40:54 GMT; domain=.wikipedia.org; secure";

dowolne:

document.cookie = "nazwa1=wart1; path=/; expires=Fri, 09 Mar 2007 16:40:54 GMT; domain=.wikipedia.org";

Zapis ".wikipedia.org" oznacza, że ciasteczko będzie widoczne we wszystkich poddomenach i domenie głównej, czyli w "wikipedia.org" oraz np. "pl.wikipedia.org", "en.wikipedia.org", "pl.news.wikipedia.org" itp.

edytuj Odczyt

Przy odczycie document.cookie ma postać:

document.cookie = "nazwa1=wart1; nazwa2=wart2; nazwa3=wart3"

Należy więc znaleźć odpowiednią nazwę i wartość oraz pamiętać przy tym, że wartość i nazwa są zakodowane. Przykład funkcji odczytującej wartość:

function PobierzWartoscCookie(nazwa) {
	var dc = document.cookie;
	var prefix = escape(nazwa) + "=";
	// znalezienie początku wartości ciasteczka
	var begin = dc.indexOf("; " + prefix); 

	// jeśli dokument nie zawiera nazwy ciastka...
	if (begin == -1)
	{ 
		begin = dc.indexOf(prefix);
		if (begin != 0)
			return null;
	// ...jeśli zawiera, to do indeksu dodajemy 2 (średnik i jedna spacja dają dwa znaki)
	}
	else 
	{
		begin += 2;
	}

	// teraz funkcja szuka indeksu wystąpienia następnego średnika po miejscu, 
	// w którym znaleziono nazwę ciastka
	var end = document.cookie.indexOf(";", begin);
	// jeśli nie ma więcej ciastek, to indeks końcowy równy jest długości pliku
	if (end == -1) 
		end = dc.length;
	// zwracamy fragment łańcucha, zawierający wartość ciastka
	return unescape(dc.substring(begin + prefix.length, end)); 
}

Przypisy

  1. ↑ 1,0 1,1 Specyfikacja ciasteczek w Nestscape
  2. ↑ phpBB FAQ – patrz pytanie 23: "I (or my users) cannot stay logged in to the forum!"
  3. ↑ Sesje PHP — Przekazywanie identyfikatora sesji

edytuj Zobacz też