2009-03-24 14 views
39

Czy istnieje sposób w PHP, aby uzyskać listę wszystkich sesji (i zmiennych w każdym z nich) na serwerze?Zapętlanie wszystkich sesji serwera w PHP

Zasadniczo mamy funkcję konserwacji, która musi wiedzieć, którzy użytkownicy są aktualnie zalogowani na stronie. Już przechowujemy dane dla każdego użytkownika w zmiennej sesji, ale mam nadzieję, że będę mógł przeglądać każdą z tych sesji i pobrać potrzebne dane.

MÓJ PHP jest bardzo ograniczony (jestem programiście .Net), ale jeśli ktoś wie, czy to jest możliwe (i jak to zrobić) byłbym bardzo wdzięczny. Przeszukałem go w ten sposób, a wyniki, które znalazłem, miały tendencję do stwierdzenia, że ​​nie było to możliwe, ale uważam, że jest to trudne do zaakceptowania.

Nadal, jeśli nie możesz, nie możesz, ale myślałem, że moi kumple na StackOverflow mogą dać mi ostateczną odpowiedź!

Odpowiedz

38

PHP przechowuje dane sesji dla każdego użytkownika w folderze tymczasowym na serwerze. Ten folder jest zdefiniowany w pliku konfiguracyjnym php.ini w zmiennej session.save_path. Odszukaj tę wartość od wewnątrz pliku php.ini, lub alternatywnie, utworzyć plik PHP z:

<?php echo "Session Save Path: " . ini_get('session.save_path');?> 

jak jego zawartość, a następnie otwórz plik w przeglądarce.

Po znalezieniu ścieżki zapisu danych sesji otwórz ten folder, a zauważysz dość prostą strukturę. Wszystkie sesje są przechowywane w formacie: sess_ $ SESSIONID.

Dane sesji są serializowane przed ich zapisaniem na dysku. W związku z tym obiekty przechowywane w pliku sesji musiałyby zostać przekształcone do postaci szeregowej przed użyciem. Jeśli jednak używasz zwykłego tekstu, który jest przechowywany tak jak jest, do przechowywania danych sesji (np. $_SESSION['userid'] = 1234) w celu przechowywania informacji o użytkownikach, to powinno być łatwe do przeanalizowania danych, których szukasz. w plikach.

Jeszcze jedno ... Nie zajrzałem do tego, ale wygląda na to, że identyfikator sesji, który pojawia się w nazwie pliku, odpowiada bezpośrednio, na przykład, nazwie pliku cookie PHPSESSID przechowywanego na komputerze użytkownika. Tak więc, mając to na uwadze, możliwe jest przechodzenie między plikami w tymczasowym katalogu sesji, pobieranie wszystkich wartości $ SESSIONID, ustawianie bieżącej ID sesji przy użyciu session_id($SESSIONID), uruchamianie sesji z session_start() i uzyskiwanie dostępu do potrzebnych danych za pomocą PHP bez konieczności samodzielnego analizowania plików zawartości. Czy ktoś może potwierdzić, czy byłoby to możliwe?

Edytuj: Poprawiono wpis, aby pasował do komentarza Itaya.

+13

Warto wspomnieć, że tego typu hacki są okropnym pomysłem. PHP ma architekturę "nic nie udostępniaj", a próba zhakowania go będzie jak przy użyciu śrubokręta do sadzenia paznokci. Zamiast analizować pliki wewnętrzne serwera, utwórz własną lub lepiej korzystaj z bazy danych, aby zachować wszystko, czego potrzebujesz. – smentek

+0

php ma opcję zapisywania danych sesji w pamięci. nie zawsze możemy wyciągnąć je z plików. – jondinham

+1

i więcej, pliki "ses_ *" mogą być umieszczone pod wielopoziomową strukturą katalogów. to jest to, co powiedzieliśmy w php.net – jondinham

6

Oto bardziej zwięzły sposób, aby uzyskać listę sesji poprzez przechowywanych plików:

<?php 
print_r(scandir(session_save_path())); 
?> 
0

To będzie Ci dane dla wszystkich sesji, zapisanych w tablicy i indeksowane przez ID sesji:

<?php 
$allSessions = []; 
$sessionNames = scandir(session_save_path()); 

foreach($sessionNames as $sessionName) { 
    $sessionName = str_replace("sess_","",$sessionName); 
    if(strpos($sessionName,".") === false) { //This skips temp files that aren't sessions 
     session_id($sessionName); 
     session_start(); 
     $allSessions[$sessionName] = $_SESSION; 
     session_abort(); 
    } 
} 
print_r($allSessions);