2009-02-07 16 views
11

Byłem zainteresowany tym, jak sesje działają wewnętrznie, ale mam niewielką wiedzę na temat C (i nie jestem pewien, gdzie szukać w tym źródle PHP).Czy moje rozumienie sesji PHP jest poprawne?

To co rozumiem sesji w chwili:

  1. Po rozpoczęciu sesji użytkownik zostaje przypisany identyfikator sesji, który jest przechowywany w pliku cookie.
  2. Po zapisaniu danych sesji (przez $_SESSION) jest ona przechowywana w systemie plików, z odpowiednim identyfikatorem sesji i czasem wygaśnięcia.

Czy to prawda? Jaka jest również metoda tworzenia identyfikatora sesji? Zakładam, że jest on oparty na czasie, ale co, jeśli dwóch użytkowników wysyła żądanie w tym samym czasie? Jakie metody są stosowane wewnętrznie, aby zapobiec uzyskaniu tego samego identyfikatora?

Dzięki,

Odpowiedz

27

Moje rozumienie jest procesem obsługi sesji wewnętrznego jest następujący:

Kiedy session_start nazywa, PHP szuka parametru z klientem, który został wysłany przez POST, GET, lub w pliku cookie (w zależności od konfiguracji, patrz session.use_cookies, session.use_only_cookies i session.use_trans_sid) z nazwą o wartości session.name, aby użyć identyfikatora sesji już rozpoczętej sesji.

Po znalezieniu prawidłowego identyfikatora sesji próbuje pobrać dane sesji z pamięci (patrz session.save_handler) w celu załadowania danych do $_SESSION. Jeśli nie można znaleźć identyfikatora lub jego użycie jest zabronione, PHP generuje nowy identyfikator za pomocą funkcji mieszającej (patrz session.hash_function) na danych źródła, które generuje losowe dane (patrz session.entropy_file).

Po zakończeniu uruchamiania lub po wywołaniu session_write_close dane sesji w $_SESSION są przechowywane w przeznaczonym do tego miejscu.

1

Identyfikator sesji to prawdopodobnie losowy ciąg liter i cyfr. Byłoby również dziwne, gdyby PHP nie sprawdziło, czy jest unikatowe i dlatego nie może być takie samo dla dwóch użytkowników. Jeśli chodzi o (1) i (2), powiedziałbym, że masz rację, ale ostatnio nie pracowałem z PHP, więc nie wahaj się mi uwierzyć.

15

Spójrz na php_session_create_id w ext/session/session.c w źródle php

To idzie tak:

  • dostać godzinę
  • uzyskać zdalny adres IP
  • zbudować ciąg z sekundy i mikrosekund od bieżącego czasu, wraz z adresem IP
  • podawać go do skonfigurowanego session hash function (MD5 lub SHA1)
  • jeśli skonfigurowany, karmić kilka dodatkowych losowości z entropy file
  • generuje ostateczną wartość skrótu

więc uzyskanie duplikatu jest dość trudne.Powinieneś jednak zapoznać się z koncepcją naprawy sesji, która pozwala intruzowi potencjalnie wybrać parametr session_id, który jego cel przyjmie - patrz Sessions and Cookies, aby uzyskać dobry podkład.

Powiązane problemy