Jak działają sesje PHP? (nie „jak są używane?”)

129

Pliki sesji są zwykle przechowywane, powiedzmy, /tmp/na serwerze i nazywane sess_{session_id}. Patrzyłem na zawartość i nie mogę dowiedzieć się, jak naprawdę działają.

Pobieranie nazwy i zawartości zmiennej z pliku jest łatwe. Ale skąd PHP wie, która sesja należy do kogo?

Session_id wydaje się całkowicie losowy, a jeden adres IP może mieć kilku użytkowników, a każdy użytkownik może mieć kilka sesji, jeśli ma otwarte więcej niż jedno okno przeglądarki.

Jak to działa?

Christoffer
źródło

Odpowiedzi:

206

W ogólnej sytuacji:

  • identyfikator sesji jest wysyłany do użytkownika podczas tworzenia jego sesji.
  • jest przechowywany w pliku cookie (domyślnie nazywanym PHPSESSID)
  • ten plik cookie jest wysyłany przez przeglądarkę do serwera przy każdym żądaniu
  • serwer (PHP) wykorzystuje ten plik cookie, zawierający identyfikator sesji, aby wiedzieć, który plik odpowiada temu użytkownikowi.

Dane w plikach sesji to zawartość $_SESSIONserializowana (tj. Reprezentowana jako ciąg - z funkcją taką jak serialize ) ; i jest usuwany z serializacji, gdy plik jest ładowany przez PHP, aby zapełnić $_SESSIONtablicę.


Czasami identyfikator sesji nie jest przechowywany w pliku cookie, ale wysyłany również w adresach URL - ale w dzisiejszych czasach jest to dość rzadkie.


Aby uzyskać więcej informacji, możesz zajrzeć do sekcji Obsługa sesji w podręczniku, która zawiera przydatne informacje.

Na przykład istnieje strona o przekazywaniu identyfikatora sesji , która wyjaśnia, w jaki sposób identyfikator sesji jest przekazywany ze strony na stronę za pomocą pliku cookie lub w adresach URL - i jakie opcje konfiguracji mają na to wpływ.

Pascal MARTIN
źródło
5
Jak urządzenie mobilne (z aplikacji natywnej) normalnie obsługuje sesje? Przechowujesz identyfikator sesji? A może to jest OAuth?
Adam Waite,
15

Jak działa sesja PHP

  • Po pierwsze PHP tworzy 16-bajtowy unikalny numer identyfikacyjny (przechowywany jako ciąg 32 znaków szesnastkowych, np. a86b10aeb5cd56434f8691799b1d9360) Dla indywidualnej sesji.

  • Plik cookie PHPSESSID przekazuje ten unikalny numer identyfikacyjny do przeglądarki użytkownika w celu zapisania tego numeru.

  • Na serwerze tworzony jest nowy plik o tej samej nazwie o unikalnym numerze identyfikacyjnym z prefiksem sess_ (tj sess_a86b10aeb5cd56434f8691799b1d9360.)

  • Przeglądarka wysyła ten plik cookie do serwera przy każdym żądaniu.

  • Jeśli PHP otrzyma ten unikalny numer identyfikacyjny z pliku cookie PHPSESSID (przy każdym żądaniu), wówczas PHP szuka w katalogu tymczasowym i porównuje ten numer z nazwą pliku. Jeśli obie są takie same, pobiera istniejącą sesję, w przeciwnym razie tworzy nową sesję dla tego użytkownika.

Sesja zostaje zniszczona, gdy użytkownik zamyka przeglądarkę lub opuszcza witrynę. Serwer kończy również sesję po upływie określonego z góry czasu sesji. Są to proste kroki mechanizmu używane przez PHP do obsługi sesji. Mam nadzieję, że ten artykuł pomoże ci zrozumieć, jak działa PHP SESSION.

Sohel Rana
źródło
Ale jeśli, powiedzmy, jestem zalogowany w określonej witrynie (czyli w sesji) i otwieram nową kartę mysite.com/cart. Otrzymam także moje „Hello Joe Doe, 5 wiadomości, oto lista Twoich zakupów ...”, czyli informacje o sesji. - Ale dlaczego przeglądarka w odniesieniu do tej pustej karty wysyłałaby jakikolwiek identyfikator sesji wraz z żądaniem GET? szybka aktualizacja: Ach, znalazłem odpowiedź: +)
Frank Nocke
Czy mogę zapytać, w jaki sposób identyfikator sesji może zapewnić bezpieczeństwo? Na przykład, jeśli użytkownik zaloguje się i dotrze do swojego profilu, a następnie zmieni parametr url, aby uzyskać dostęp do profilu innego użytkownika, w jaki sposób identyfikator sesji może temu zapobiec?
Andrewboy
4

Identyfikator sesji jest rzeczywiście losowy i jest przekazywany w pliku cookie lub w adresie URL, w zależności od konfiguracji. Być może widziałeś już PHPSESSID = xxxx w niektórych adresach URL, istnieje również plik cookie o tej nazwie.

Julien Lebosquain
źródło
2

Sesje w PHP są uruchamiane za pomocą funkcji session_start (). Podobnie jak funkcja setcookie (), funkcja session_start () musi znajdować się na stronie przed jakimkolwiek kodem HTML, łącznie z pustymi wierszami. Będzie to wyglądać tak: <?php session_start( );?><html><head> ....... itd. Funkcja session_start () generuje losowy identyfikator sesji i przechowuje go w pliku cookie na komputerze użytkownika (jest to jedyna informacja o sesji, która jest faktycznie przechowywana po stronie klienta. ) Domyślną nazwą pliku cookie jest PHPSESSID, chociaż można to zmienić w plikach konfiguracyjnych PHP na serwerze (większość firm hostingowych pozostawia to w spokoju.) Aby odwołać się do identyfikatora sesji w kodzie PHP, należy odwołać się do zmienna $ PHPSESSID (to nazwa ciasteczka; pamiętasz to z Cookies?)

Akbor
źródło