Odczytanie sesji mając tylko jej ID

19 sierpnia 2009

Dzisiaj stanąłem przed pewnym problemem, który powstał w takiej sytuacji:
- mam panel administracyjny dostępny po zalogowaniu
- informacja o zalogowanym użytkowniku trzymana jest w sesji
- ID sesji jest przekazywany wyłącznie za pomocą cookie
- potrzebuję komunikować się między PHP a Flash

Problem powstał właśnie w miejscu komunikacji między PHP i Flash. Z jakiegoś powodu plik PHP wywoływany przez Flash nie potrafił odczytać sesji, tworzył nową. A ja musiałem odczytać info z sesji czy użytkownik jest zalogowany i ma odpowiednie uprawnienia. Ten element strony odpowiada za wgrywanie zdjęć na serwer i nie mógłbym zostawić tak dużej dziury w bezpieczeństwie.

Osobiście byłem tym problemem mocno zaskoczony bo przecież ID sesji przekazywane jest w cookie i PHP nie powinno mieć żadnego problemu z odczytaniem tej wartości. W jakiś sposób przeszkadza tu Flash bo inne skrypty oparte na Ajax działają bez problemów. Niestety na budowę Flash nie mam wpływu, korzystam z gotowego rozwiązania. Gdzieś tutaj widziałem źródła Flash ale nie po to stosuję gotowca żeby teraz w nim grzebać i pamiętać o zmianach zawsze gdy będę przeprowadzał aktualizację.

Co zrobić?
Szukałem jakiegoś sposobu aby zmusić PHP do prawidłowego pobrania sesji. I nic nie znalazłem... Poradziłem sobie więc inaczej :)

W konfiguracji Flash mogę samodzielnie zdefiniować ścieżkę do mojego pliku PHP. Dokleiłem na jej końcu coś takiego:

PHP:
  1. ?<?php echo session_name(); ?>=<?php echo session_id(); ?>

To powoduje, że nazwa i ID sesji są przekazywane do pliku PHP metodą GET.

Teraz przechodzimy do pliczku PHP. Na jego początku doklejam to:

PHP:
  1. if(!preg_match('/^[0-9a-f]{32}$/si', $_GET[session_name()])) {
  2. }
  3.  

W pierwszej linijce sprawdzam asekuracyjnie czy przekazany parametr w $_GET to prawidłowy ID sesji. Jeżeli nie to kończę wykonywanie skryptu.

Najważniejsza jest ostatnia linijka. Odczytuję ścieżkę do pliku w którym przetrzymywane są informacje zapisane w sesji o ID przekazanym do skryptu metodą GET. Pobieram zawartość tego pliku i zapisuję wszystko jako zmienne sesji za pomocą session_decode.

Takie rozwiązanie ma jedną wadę. Jak wspomniałem wcześniej, pliczek odpalany z Flasha powoduje start nowej sesji. Za pomocą wyżej opisanej metody nowa sesja stanie się kopią istniejącej. A więc będziemy mieli dwie sesje, jedną niepotrzebną...

Mimo to metoda działa i jest chyba całkiem uniwersalna, powinna działać bez problemów na większości serwerów. Cały skrypt jest wykorzystywany tylko w panelu administratora z którego korzysta zaledwie kilka osób i robią to sporadycznie więc problem podwójnej sesji nie jest raczej zbyt dokuczliwy. A bezpieczeństwo zostało zapewnione.

 Dodaj komentarz

2 odpowiedzi dla tego wpisu

  1. kmg napisał:

    w jakich korzystasz z flasha?
    Do czego ma służyć i jakiego „gotowego” rozwiązania używasz?

    (jeśli chcesz możesz odpowiedzieć na priv ;) )

  2. MariuszT napisał:

    Szukałem jakiegoś rozwiązania za pomocą którego będę mógł za jednym razem wybrać wiele plików i wysłać je na serwer bez przeładowania strony.

    Drugie można osiągnąć tworząc bodajże pływające ramki (dokładnie nie wiem, jakieś zabawy z JS ale wiem na pewno, że nie jest to Ajax bo on na to nie pozwala).

    Z pierwszym jest problem. Standardowe pole <input type=”file”> pozwala za jednym razem wybrać tylko jeden plik. I tu z pomocą przychodzi Flash gdzie takich ograniczeń nie ma (a raczej sami decydujemy jakie są ograniczenia).

    Korzystam ze świetnego skryptu uploadify http://www.uploadify.com/. Naprawdę ciekawe rozwiązanie. Spełnia oba powyższe warunki, łatwo zaimplementować itd. Ładnie mi przesyła pliki na serwer, łatwo obsłużyć różne akcje (np. tworzę div’y po dodaniu zdjęcia gdzie dodatkowo mogę wpisać autora i opis do zdjęcia) a nawet dodałem funkcjonalność sortowania zdjęć metodą przeciągnij upuść i w ten sposób decyduję w jakiej kolejności zdjęcia mają się pojawiać na stronie.

Odpowiedz



Podobne wpisy: